我有一个 C++ 库,它使用 ADODB 在 MSSQL 数据库中调用存储过程。在开发数据库上一切正常。但是在测试数据库上,我收到 Com 错误 0x800a0e78:如果对象已关闭,则不允许使用此选项。
代码看起来像
ADODB::_CommandPtr cmd = NULL;
ADODB::_RecordsetPtr rs = NULL;
CHECKHR(cmd.CreateInstance( __uuidof( ADODB::Command) ));
cmd->ActiveConnection = m_connexion;
cmd->CommandText = "my_stored_procedure";
cmd->CommandType = ADODB::adCmdStoredProc;
CHECKHR(cmd->Parameters->Refresh());
//input param
cmd->Parameters->GetItem(paramIndex)->put_Value(paramValue);
// output param
cmd->Parameters->GetItem(paramIndex)->PutDirection(ADODB::adParamOutput);
rs = cmd->Execute( NULL, NULL, ADODB::adCmdStoredProc);
while(! rs->ADO_EOF ) { ...
如果我使用测试数据库,rs->ADO_EOF 是程序崩溃的地方。
注意:两个数据库中的存储过程相同,并且返回相同的数据。还有一个调用另一个 SP 的流程。它适用于测试数据库。该问题仅出现在此特定 SP 上。
我倾向于认为这不是代码问题,因为它适用于开发数据库。但是我可以始终如一地重现测试数据库的问题。
请建议我应该采取的下一步行动来解决这个问题
更新
由于一些奇迹,这个 C++ 异常在 1 天后消失了。但它非常慢,以至于执行几乎总是超时。我不知道如何为这种行为辩护
更新:2013-07-18
过了这么久,错误又出现了。这次使用具有相同 SP 的开发数据库
[Com error 0x800a0e78 : Operation is not allowed when the object is closed.
在同一条线上
while(! rs->ADO_EOF ) {
在 rs 中,我可以看到指向 ADODB 记录集对象的内存地址。但是 rs->ADO_EOF 正在生成上述错误