我用AddNew只能添加一条记录添加多条出错“在获得新的之前,必须释放所有的ROW句柄”,怎么样才能添加多条那? 
ptrConnSend.ptrADOSet.CreateInstance(__uuidof(Recordset));
ptrConnSend.ptrADOSet->CursorType = adOpenKeyset;
ptrConnSend.ptrADOSet->LockType = adLockBatchOptimistic;
ptrConnSend.ptrADOSet->Open("Table", ptrConnSend.ptrDBConn.GetInterfacePtr(),adOpenKeyset, adLockBatchOptimistic, adCmdTable); 
ptrConnSend.ptrADOSet ->AddNew();
ptrConnSend.ptrADOSet ->PutCollect( "Name1" , _variant_t("2128") ) ;
ptrConnSend.ptrADOSet ->PutCollect( "name2" , _variant_t("104") ) ; 
ptrConnSend.ptrADOSet ->PutCollect( "时间" , _variant_t("2002-02-23 08:08:08") ) ; ptrConnSend.ptrADOSet ->PutCollect( "状态" , _variant_t("128") ) ;
ptrConnSend.ptrADOSet ->PutCollect( "平均值" , _variant_t("1.04") ) ;
ptrConnSend.ptrADOSet ->AddNew();   //出错
ptrConnSend.ptrADOSet ->PutCollect( "Name1" , _variant_t("2128") ) ;
ptrConnSend.ptrADOSet ->PutCollect( "name2" , _variant_t("104") ) ; 
ptrConnSend.ptrADOSet ->PutCollect( "时间" , _variant_t("2002-04-23 08:08:08") ) ; ptrConnSend.ptrADOSet ->PutCollect( "状态" , _variant_t("128") ) ;
ptrConnSend.ptrADOSet ->PutCollect( "平均值" , _variant_t("1.04") ) ;
ptrConnSend.ptrADOSet->UpdateBatch(adAffectAll);

解决方案 »

  1.   

    ptrConnSend.ptrADOSet ->update()
    再次addnew之前先update一下呢?
      

  2.   

    再次addnew之前update怎么能体现出批处理呢?
    楼主的意思是怎么能在记录集中先添加了多条记录,然后一次导入数据库吧?
    我也遇到了相同的问题,一起学习
      

  3.   

    先把它的数据库连接置空
    VARIANT varnull;
    VariantInit(&varnull);
    varnull.vt = VT_UNKNOWN;
    varnull.punkVal = NULL;
    pRst->PutActiveConnection(varnull); 
    然后
    for(int i=0;i<128;i++)
    {
    AddNew()
    ...
    Update()
    }
    提交执行:
    pRst->PutActiveConnection(pConn.GetInterfacePtr());
    pRst->UpdateBatch(adAffectAll);
    pRst->PutActiveConnection(varnull);
      

  4.   

    to 楼上大师:
    你还是在每个AddNew之后调用了Update呀?
    为什么要置空链接呢?直接使用链接不是也可以吗?
      

  5.   

    to masterz(www.fruitfruit.com)
     你说的方法还是不行啊,这种情况下不需要打开记录集了吗?-----------------------------------------------------------
    VARIANT varnull;
    VariantInit(&varnull);
    varnull.vt = VT_UNKNOWN;
    varnull.punkVal = NULL;
    pRst->PutActiveConnection(varnull); 
    然后// 这之前是不是应该先打开记录集? 
    for(int i=0;i<128;i++)
    {
      AddNew()  //此句是否应该是pRs->AddNew();
      ...       //pRs->Fields->GetItem((short)0)->Value = (short)3;
                //...
      Update()  //pRs->Update()
    }
    提交执行:
    pRst->PutActiveConnection(pConn.GetInterfacePtr());
    pRst->UpdateBatch(adAffectAll);
    pRst->PutActiveConnection(varnull);
     
      

  6.   

    我理解的UpdateBatch是这样的: 首先是打开一个记录集,设定
    pRs->CursorType = adOpenKeyset;
    pRs->LockType = adLockBatchOptimistic;然后打开一个表"test",第一个记录段为整形然后调用
    pRs->Open("test",(IDispatch*)m_pConnection,adOpenKeyset, adLockBatchOptimistic, adCmdTable);for(int i=0;i<5;i++)
    {
       pRs->AddNew(); 
       pRs->Fields->GetItem((short)0)->Value = (short)i;
       pRs->Update();
    }
    pRs->UpdateBatch();pRs->Close();
    调试了一下,当i=1时,AddNew()语句出错(IDispatch error #3109),把Update去掉还是出错,原因在哪呢? 
    进行批处理导入数据时,其原理是不是先在记录集中更改,然后执行UpdateBatch命令吗?
    我的错误又在哪里呢? 期盼大牛给个清晰的解答,谢谢,我可以另加分
      

  7.   

    _ConnectionPtr pConn("ADODB.Connection");
    pConn->Open(LPCSTR(m_sConnectionStr),(LPCSTR)suid,(LPCSTR)spwd,adConnectUnspecified);
    _RecordsetPtr  pRst("ADODB.Recordset");
    pRst->PutCursorLocation(adUseClient);
    pRst->Open(tablenamebuf, _variant_t((IDispatch *) pConn, true),
    adOpenStatic, adLockBatchOptimistic, adCmdTable);

     VARIANT varnull;
    VariantInit(&varnull);
    varnull.vt = VT_UNKNOWN;
    varnull.punkVal = NULL;
    pRst->PutActiveConnection(varnull);
    然后
    for(int i=0;i<128;i++)
    {
    AddNew()
    ...
    Update()
    }
    提交执行:
    pRst->PutActiveConnection(pConn.GetInterfacePtr());
    pRst->UpdateBatch(adAffectAll);
    pRst->PutActiveConnection(varnull);