我碰到了这样的问题,想请大家帮忙我用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这种方式得到的都是正确的值,空值是空值,非空值是非空值。不会出现空值被非空值覆盖的情况。请问这种情况应该怎么处理。非常感谢!!!!

解决方案 »

  1.   

    取记录是m_pRecordSet->Opne()一次全取回来的吧?请问应该怎么清空啊?
      

  2.   


    覆盖是你的代码问题,就算是一次取出来,也不会出现结果集中数据乱覆盖的情况。你那个覆盖应该是你的代码中的临时变量没有清空。你在while里面把结果集对应的字段值打出来看看?
      

  3.   

    在while里没有做什么特殊操作,全都是赋值。而且是赋到一个结构体,每次循环开始时,都新new一个结构体,不应该会是本地变量的问题
    我在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();
    }
      

  4.   

    是不是你的
    CMyRecordSet 
    里面的问题啊,你继承了那个类,但里面重写了方法没有对数据进行清除?
    我觉得应该ADO不会出这种问题的。
      

  5.   

    谢谢楼上的朋友我也觉得肯定不是ADO更不是C++问题。肯定是我用的有问题。关键就是我实在不知道哪里出了问题。对数据库和ADO的知识掌握的太少了希望有朋友能帮忙我是这继承的CADORecordBindingclass CSet : public CADORecordBinding
    {
    public:
    CSet(); // 构造函数里就是初始化所有成员变量,没有其它的操作
    virtual ~CSet(){};
    BEGIN_ADO_BINDING(CSet)
    ADO_FIXED_LENGTH_ENTRY2(1, adDate, m_a, FALSE)
            // 还有很多字段,但应该不重要,因为我试过每个字段都有这种问题
            END_ADO_BINDING()        COleDateTime m_a;
    }希望大家能帮忙