VC++6.0中ADO数据绑定CADORecordBinding的问题

gezihou 2005-08-07 01:44:27
为什么数据绑定的过程中,绑定结构子类的大小经常会将Connection的接口指针给冲掉。
绑定类的定义如下:
class CADO_BIND_METER : public CADORecordBinding
{
public:
BEGIN_ADO_BINDING(CADO_BIND_METER) //将数据库字段与ADO记录集字段变量绑定
ADO_NUMERIC_ENTRY(1,adInteger,m_iId,10,0,m_stsId,true)
ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_sName,sizeof(m_sName),m_stsName,true)
ADO_VARIABLE_LENGTH_ENTRY2(3,adVarChar,m_sName1,sizeof(m_sName1),m_stsName1,true)
ADO_NUMERIC_ENTRY(4,adInteger,m_iStatus,10,0,m_stsStatus,true)
ADO_NUMERIC_ENTRY(5,adInteger,m_iSpeed,10,0,m_stsStatus,true)
ADO_VARIABLE_LENGTH_ENTRY2(6,adVarChar,m_sMiaoshu,sizeof(m_sMiaoshu),m_stsMiaoshu,true)
ADO_VARIABLE_LENGTH_ENTRY2(7,adVarChar,m_sDevice_Name,sizeof(m_sDevice_Name),m_stsDevice_Name,true)
ADO_NUMERIC_ENTRY(8,adInteger,m_iDevice_Id,10,0,m_stsDevice_Id,true)
ADO_FIXED_LENGTH_ENTRY(9, adBoolean, m_bDevice_Is_Fanjie, m_stsDevice_Is_Fanjie, true)
END_ADO_BINDING()

int m_iId;//定义ADO记录集字段变量(与数据库表字段相对应)
CHAR m_sName[20];
CHAR m_sName1[40];
int m_iStatus;
int m_iSpeed;
CHAR m_sMiaoshu[100];
CHAR m_sDevice_Name[20];
int m_iDevice_Id;
bool m_bDevice_Is_Fanjie;

WORD m_stsId; //定义ADO记录集状态变量
WORD m_stsName;
WORD m_stsName1;
WORD m_stsStatus;
WORD m_stsSpeed;
WORD m_stsMiaoshu;
WORD m_stsDevice_Name;
WORD m_stsDevice_Id;
WORD m_stsDevice_Is_Fanjie;
WORD waste;//不加不行

CADO_BIND_METER();
virtual ~CADO_BIND_METER();

};
执行函数部分如下,其中数据库连接已经成功,m_meter为CADO_BIND_METER类型的成员变量:
_RecordsetPtr MYDatabase::getRecordset(CString sql, int iType)
{
// _RecordsetPtr m_pRecordset;
if(!m_pConnection->State)
return NULL;
m_pRecordset.CreateInstance("ADODB.Recordset");

try
{
m_pRecordset->CursorLocation=adUseClient;
m_pRecordset->PutActiveConnection(m_pConnection.GetInterfacePtr());
m_pRecordset->Open(_bstr_t(sql),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText);

IADORecordBindingPtr picRs(m_pRecordset);
picRs->BindToRecordset(&m_meter);//执行到这里会改变m_pConnection的IUnknown->__vfptr指针的值,并使接口功能不可用从而破坏数据库连接
}
catch(_com_error e)///捕捉异常
{
。。。。。。。。。。。
}

return m_pRecordset;
}

对于最后声明的这个WORD变量是没有用的,但是不加上他还不行。没用他在执行到picRs->BindToRecordset(&m_meter)这句时会出现错误操作。加上那个声明,或减少相应的声明个数大一定程度就可以避免这一现象。
百思不得其解,是否CADORecordBinding类或者数据绑定的接口有什么bug呀。
...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gezihou 2005-08-14
  • 打赏
  • 举报
回复
to masterz(www.fruitfruit.com) :
非常感谢!程序改过来以后,没有再碰到类似的问题,看来是位数差异造成的内存空间产生混乱。
to iGray(奇迹MU):
谢谢你的祝福!
masterz 2005-08-10
  • 打赏
  • 举报
回复
WORD是16位的
iGray 2005-08-10
  • 打赏
  • 举报
回复
MFC的里面的#ifdef这类的宏特别多,照说WORD和ULONG都是32位的,应该不是WORD定义的问题,九成九是你代码有错。你别绑这么多先,绑定一个试试,看看哪里出错了,
注意绑定到的变量类型与数据库表中字段类型的完全配匹,好运:)
masterz 2005-08-10
  • 打赏
  • 举报
回复
MSDN上用ULONG类型的成员保存status,你把WORD改为ULONG看看
gezihou 2005-08-09
  • 打赏
  • 举报
回复
up
gezihou 2005-08-07
  • 打赏
  • 举报
回复
在跟踪的时候发现m_pConnection的IUnknown->__vfptr的正常值被清空,有谁遇到过同样的问题吗

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧