我的代码类似:
 _ConnectionPtr    pConn(__uuidof(Connection));
  __RecordsetPtr     pRs(__uuidof(Recordset));
  IADORecordbinding *piAdo = NULL;
  CTestDBRs          rsTest;  pConn->open(....);
  pRs->open(...);
  pRs->QueryInterface(...);
  piAdo->BindRecord(&rsTest);  strcpy(rsTest.m_szCol1 ,"test1");
  strcpy(rsTest.m_szCol2 ,"test2");
  
  piAdo->AddNew(&rsTest);
  
  pRs->Update();
//////////////////////////////////////////////////////
以上代码为简写部分,连接等都没有错误,但问题在于,如果数据库的记录为空时,这种做法无法在记录集中增加新记录,原因提示是无法定位EOF或BOF,我想可能是光标的问题,但是没有想到解决的办法,那位有高招说来听听。在MSDN上有一个关于绑定的CONS版本,我试了一下,也不能完成,只要记录集为空就无法增加,但如果记录集中有两条以上数据均不会有问题,欢迎有经验的朋友给点建议,也希望有兴趣的一起讨论一下,我的程序到底在什么 地方出了问题,用其它方法增加我知道可以,但现在我不想讨论,请就些话题,谈谈思路。谢谢。

解决方案 »

  1.   

    上面的等于没有说,我都不用判断,现在记录集就是空,问题是如何addnew.
      

  2.   

    把光标移到第一个位置,MoveFirst
      

  3.   

    不会吧,那如果数据集为空岂不永远没有办法添加了吗?m_pRecordset->AddNew();
    m_pRecordset->PutCollect("username",_variant_t(m_UserName));
    m_pRecordset->PutCollect("old",atol(m_Old));
    m_pRecordset->Update();
    这样就可以,和你的机制没什么区别呀。不管原来有没有记录。学习!
      

  4.   

    我想是的当你的rsTest为NULL时,piAdo绑定它时是不会做一些初始化工作,或者说是绑定失败。
    这时你想调用它的方法是失败的。然而,我建议你用try{}catch{}把错误捕获后,再看看到底是什么问题。或许这样会快些。
      

  5.   

    用movefirst()或其它是绝对不行,一执行就发生异常。我已经有错误捕获了,只是没有在上面写出来,提示:大概意思就是EOF或BOF出了问题。只是不知道如何增加,MSDN上的例子也不行,那个例子也有问题。这个问题好像两年前就有人问过,可是没有得到解决。
      

  6.   

    添加一句:
    pRs->CursorLocation = adUseClient;
      

  7.   

    试试bohut(伯虎)的方法。请问楼主把
    piAdo->BindRecord(&rsTest);
    这一句拿掉是好的吗?帮定了不会影响原来Recrodset的addnew方法的吧,还有把你open的参数都拿出来看看。
      

  8.   

    pRs->Update();
    这一句是不是要用piAdo->Update(); ?? 
      

  9.   

    piAdo->AddNew(&rsTest); // 这里用IADORecordbinding的ADDNEW
      
      pRs->Update(); // 这里用_pRecordsetPtr的update方法。这样怕是有问题吧。
      

  10.   

    用SQL当然可以,但有50项字段,太多了,更何况,我想知道绑定解决问题的方法。
      

  11.   

    open语句等,和MSDN上的一样,我就是把原例子拿来用就是,上面(伯虎)兄台的,我倒是要试一下。
      

  12.   

    Use the AddNew method to create and initialize a new record. Use the Supports method with adAddNew (a CursorOptionEnum value) to verify whether you can add records to the current Recordset object.After you call the AddNew method, the new record becomes the current record and remains current after you call the Update method. If the Recordset object does not support books, you may not be able to access the new record once you move to another record. Depending on your cursor type, you may need to call the Requery method to make the new record accessible.这段话不知道对楼主有没有帮助。
    用bohut(伯虎)的方法,楼主也要考虑一下实际应用中把Cursor放在本地是否合适。