VC++6.0中ADO数据绑定CADORecordBinding的问题
为什么数据绑定的过程中,绑定结构子类的大小经常会将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呀。