Доброго времени суток)
У меня есть проблема.
Создаю с помощью визарда класс-потребитель 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()
{
}