我用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);
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);
再次addnew之前先update一下呢?
楼主的意思是怎么能在记录集中先添加了多条记录,然后一次导入数据库吧?
我也遇到了相同的问题,一起学习
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);
你还是在每个AddNew之后调用了Update呀?
为什么要置空链接呢?直接使用链接不是也可以吗?
你说的方法还是不行啊,这种情况下不需要打开记录集了吗?-----------------------------------------------------------
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);
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命令吗?
我的错误又在哪里呢? 期盼大牛给个清晰的解答,谢谢,我可以另加分
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);