0

我有一个 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 正在生成上述错误

4

0 回答 0