问题:
我看到两个线程中每个线程都有E_FAIL和数据库损坏的组合,每个线程都有自己的连接打开到Jet 4.0 mdb。
情境:
我有一个申请表:
线程1是主线程。它使用提供程序“Microsoft.Jet.OLEDB.4.0”向Jet 4.0 mdb打开ADO连接。它负责通过
将数据插入位于mdb中的两个表之一hr = pADOConn->Execute("INSERT INTO ...", NULL, adCmdText|adExecuteNoRecords, NULL);
// occasionally returns E_FAIL
线程2是线程1的子节点。它还使用完全相同的连接字符串打开ADO连接。它负责迭代已经存在于两个表中的每个表中的记录,将每行“抽”到服务器,然后从表中删除该行。这是通过(仅缩写为相关部分)来实现的:
countSQL = "select count(*) from TABLE";
iRecCount = pADORstTable->Open(countSQL, pADOConn2, adOpenKeyset, adLockOptimistic, adCmdText);
for (iRecCtr = 0; iRecCtr < iRecCount; iRecCtr++)
{
// provides the capability to skip records
strSQL = "SELECT TOP 1 * FROM (SELECT TOP " + iSkipRecords +
" * FROM TABLE ORDER BY PriKey DESC)";
pADORst->Open(strSQL, pADOConn2, adOpenKeyset, adLockOptimistic, adCmdText);
pADORst->get_EOF(&vbEOF);
if (vbEOF)
break;
RstPriKey = GetFieldValueForPriKey(pADORst);
pADORst->Close();
pADORst->Release();
// pump record to server
...
// delete record
bstrSQL = "delete from TABLE where PriKey = " + RstPriKey;
hr = pADOConn2->Execute(bstrSQL, NULL, adCmdText|adExecuteNoRecords, NULL);
// occasionally returns E_FAIL
}
的解决方法:
编辑1:
刚尝试将两个 - &gt; Execute()包装在一个关键部分;偶尔也会从DELETE FROM中设置E_FAIL。
编辑2:
还尝试在检索主键值后立即关闭记录集(代码已更新以反映更改)
答案 0 :(得分:1)
您收到的是否有更具描述性的错误消息?我的猜测是并发违规。您可以尝试关闭并释放“pADORstTable”,因为两个记录集都在同一个表上运行。我也会在EOF之后关闭并释放“pADORst”。