我碰到了这样的问题,想请大家帮忙我用ADO进行读取操作比如表中有1,2,3条记录。第1条中的字段A为空,条2条中的字段A非空,第3条中的记录为空我的问题是:读第1条和第2条记录A字段正确,但到第3条时这个字段只要为空就会被第2条的A字段值覆盖。也就是说如果一条记录中有空值的字段,我读到本地时得到的都是上一条记录非空字段的值
比如表中:
第一条记录:a 空
第二条记录:a 1
第三条记录:a 空
我读到本地时:
第一条记录:a 空
第二条记录:a 1
第三条记录:a 1
我是这样读取的:
_bstr_t strSQL("SELECT * FROM FormName");
m_pRecordset->Open(strSQL, _variant_t((IDispatch *) m_pConnection,
true), adOpenStatic, adLockOptimistic, adCmdText);CMyRecordSet set; // 这个类继承自CADORecordBinding
IADORecordBindingPtr picRs(m_pRecordset);
HRESULT hr = picRs->BindToRecordset(&set);// 开始读返回的记录集
while (!m_pRecordset->adoEOF)
{
// 这里读取值
int a = set.a;
m_pRecordset->MoveNext();
}
绑定记录集用的是BEGIN_ADO_BINDING() END_ADO_BINDING()我尝试过这样做:
用m_pRecordset->Fields->GetItem(_variant_t("a"))->Value这种方式得到的都是正确的值,空值是空值,非空值是非空值。不会出现空值被非空值覆盖的情况。请问这种情况应该怎么处理。非常感谢!!!!
比如表中:
第一条记录:a 空
第二条记录:a 1
第三条记录:a 空
我读到本地时:
第一条记录:a 空
第二条记录:a 1
第三条记录:a 1
我是这样读取的:
_bstr_t strSQL("SELECT * FROM FormName");
m_pRecordset->Open(strSQL, _variant_t((IDispatch *) m_pConnection,
true), adOpenStatic, adLockOptimistic, adCmdText);CMyRecordSet set; // 这个类继承自CADORecordBinding
IADORecordBindingPtr picRs(m_pRecordset);
HRESULT hr = picRs->BindToRecordset(&set);// 开始读返回的记录集
while (!m_pRecordset->adoEOF)
{
// 这里读取值
int a = set.a;
m_pRecordset->MoveNext();
}
绑定记录集用的是BEGIN_ADO_BINDING() END_ADO_BINDING()我尝试过这样做:
用m_pRecordset->Fields->GetItem(_variant_t("a"))->Value这种方式得到的都是正确的值,空值是空值,非空值是非空值。不会出现空值被非空值覆盖的情况。请问这种情况应该怎么处理。非常感谢!!!!
覆盖是你的代码问题,就算是一次取出来,也不会出现结果集中数据乱覆盖的情况。你那个覆盖应该是你的代码中的临时变量没有清空。你在while里面把结果集对应的字段值打出来看看?
我在while里下断点时,看绑定后的CADORecordBinding时就是被覆盖了的while中大概是这样:
while (!m_pRecordset->adoEOF)
{
SSomeStruct *pLocal = new SSomeStruct; // 在这里下断点,看set.a时表中如果是空值就被覆盖了 pLocal->a = set.a
list.AddTail(pLocal); // list是一个CTypedPtrList<CPtrList, SSomeStruct*>
m_pRecordset->MoveNext();
}
CMyRecordSet
里面的问题啊,你继承了那个类,但里面重写了方法没有对数据进行清除?
我觉得应该ADO不会出这种问题的。
{
public:
CSet(); // 构造函数里就是初始化所有成员变量,没有其它的操作
virtual ~CSet(){};
BEGIN_ADO_BINDING(CSet)
ADO_FIXED_LENGTH_ENTRY2(1, adDate, m_a, FALSE)
// 还有很多字段,但应该不重要,因为我试过每个字段都有这种问题
END_ADO_BINDING() COleDateTime m_a;
}希望大家能帮忙