CRowset,Не работает SetData для строковых значений
От: TerminalSoul  
Дата: 20.12.09 14:05
Оценка:
Доброго времени суток)
У меня есть проблема.
Создаю с помощью визарда класс-потребитель OLE DB, провайдер -SQL Server.
Создаю объект, открываю соединение,з атем получаю данные, вобщем всё отлично. Но после того, как пытаюсь обновить значение происходит беда.
Вобщем суть такова, что я в диалоговом окне создал 3 комбобокса и один эдит. Первый комбобокс — это имя проектаи, если выбрать какойто элемент в нём, то в остальных двух(этап разработки и заказчик) установятся соответствующие записи значения, тут одна загвоздка, в таблице где хранится имя проекта, нет имени заказчика и названия этапа есть только их айдишники и поэтому мы лезем в 2 другие таблицы, чтобы узнать строковые значения.
Когда нажимается кнопка сохранить,запускается SetData, сохраняются в базе только числовые айди этапа и заказчика, а если попытаться изменить имя проекта, то оно не сохраняется. Вопрос почему?
Ах да, если пытаюсь вызвать метод Update — он возвращает, E_NONINTERFACE. И может ктонибудь объяснить подробно как работает SetData?
Код заголовка диалога:

#pragma once
#include "afxwin.h"
#include "orders.h"
#include "stages.h"
#include "users.h"
// диалоговое окно CTabDlg1
class CTabDlg1 : public CDialog
{
    DECLARE_DYNAMIC(CTabDlg1)
public:
    CTabDlg1(CWnd* pParent = NULL);   // стандартный конструктор
    virtual ~CTabDlg1();
// Данные диалогового окна
    enum { IDD = MY_TAB_DLG1 };
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV
    virtual BOOL OnInitDialog();
    DECLARE_MESSAGE_MAP()
public:
    Corders table;
    Cstages stats;
    Cusers clients;
    CComboBox order_name;
    afx_msg void OnCbnSelchangeCombo1();
    CString order_comments;
    CString order_name_val;
    afx_msg void OnEnChangeEdit1();
    afx_msg void OnCbnSelchangeCombo2();
    afx_msg void save_all();
    CComboBox order_status;
    CComboBox order_client;
    long order_status_id;
    long order_client_id;
    void init_orders();
    afx_msg void OnChangeStage();
    afx_msg void OnClientChange();
    afx_msg void OnCbnEditchangeCombo1();
};

Сам код:
Буду рад если кто ответит

/ TabDlg1.cpp: файл реализации
//
#include "stdafx.h"
#include "TRPO.h"
#include "TabDlg1.h"
#include <string>
// диалоговое окно CTabDlg1
IMPLEMENT_DYNAMIC(CTabDlg1, CDialog)
CTabDlg1::CTabDlg1(CWnd* pParent /*=NULL*/)
    : CDialog(CTabDlg1::IDD, pParent)
    , order_name_val(_T(""))
{
    CoInitialize(NULL);
    table.OpenAll();
    stats.OpenAll();
    clients.OpenAll();
}
CTabDlg1::~CTabDlg1()
{
    table.CloseAll();
}
void CTabDlg1::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_COMBO1, order_name);
    DDX_Text(pDX, IDC_EDIT1,order_comments);
    DDX_Control(pDX, IDC_COMBO2, order_status);
    DDX_Control(pDX, IDC_COMBO3, order_client);
}
BOOL CTabDlg1::OnInitDialog()
{
    CDialog::OnInitDialog();
    init_orders();
    return true;
}
BEGIN_MESSAGE_MAP(CTabDlg1, CDialog)
    ON_CBN_SELCHANGE(IDC_COMBO1, &CTabDlg1::OnCbnSelchangeCombo1)
    ON_BN_CLICKED(IDC_BUTTON1, &CTabDlg1::save_all)
    ON_CBN_SELCHANGE(IDC_COMBO2, &CTabDlg1::OnChangeStage)
    ON_CBN_SELCHANGE(IDC_COMBO3, &CTabDlg1::OnClientChange)
    ON_CBN_EDITCHANGE(IDC_COMBO1, &CTabDlg1::OnCbnEditchangeCombo1)
END_MESSAGE_MAP()
// обработчики сообщений CTabDlg1
void CTabDlg1::OnCbnSelchangeCombo1()
{
    int j=0;
    table.MoveFirst();
    do
    {
        if(order_name.GetCurSel()==j)
            break;
        j++;
    }
    while(table.MoveNext()==S_OK);
    stats.MoveFirst();
    do
    {
        if(table.m_stage_id==stats.m_stage_id)
        {
            order_status.SelectString(-1,_T(stats.m_stage_name));
            order_status_id=table.m_stage_id;
            break;
        }
    }
    while(stats.MoveNext()==S_OK);
    clients.MoveFirst();
    do
    {
        if(table.m_client_id==clients.m_user_id)
        {
            order_client.SelectString(-1,_T(clients.m_FIO));
            order_client_id=table.m_client_id;
            break;
        }
    }while(clients.MoveNext()==S_OK);
    order_comments=(CString)table.m_comments;
    UpdateData(0);
}
void CTabDlg1::save_all()
{
    CString tmp;
    UpdateData();
    order_name.GetWindowTextA(tmp);
    _tcscpy(table.m_order_name,_T(tmp));
    _tcscpy(table.m_comments,_T(order_comments));
    table.m_client_id=order_client_id;
    table.m_stage_id=order_status_id;
    table.SetData();
    HRESULT hr=table.Update();
    order_name.ResetContent();
    order_status.ResetContent();
    order_client.ResetContent();
    init_orders();
}
void CTabDlg1::init_orders()
{
    table.MoveFirst();
    stats.MoveFirst();
    clients.MoveFirst();
    do
    {
        order_name.AddString(_T(table.m_order_name));
    }while(table.MoveNext()==S_OK);
    do
    {
        order_status.AddString(_T(stats.m_stage_name));
    }while(stats.MoveNext()==S_OK);
    do
    {
        order_client.AddString(_T(clients.m_FIO));
    }while(clients.MoveNext()==S_OK);
    order_comments="";
    UpdateData(0);
}
void CTabDlg1::OnChangeStage()
{
    stats.MoveFirst();
    CString tmp;
    order_status.GetWindowTextA(tmp);
    do
    {
        if(stats.m_stage_name==tmp)
        {
            order_status_id=stats.m_stage_id;
            break;
        }
    }while(stats.MoveNext()==S_OK);
}
void CTabDlg1::OnClientChange()
{
    clients.MoveFirst();
    CString tmp;
    order_client.GetWindowTextA(tmp);
    do
    {
        if(clients.m_FIO==tmp)
        {
            order_client_id=clients.m_user_id;
            break;
        }
    }while(clients.MoveNext()==S_OK);
}
void CTabDlg1::OnCbnEditchangeCombo1()
{
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.