ADODB を使用して MSSQL データベースのストアド プロシージャを呼び出す C++ ライブラリがあります。すべてが開発データベースで正常に動作します。しかし、テスト データベースでは、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 が呼び出されるフローがもう 1 つあります。これは、テスト データベースとうまく連携します。この問題は、この特定の SP でのみ発生します。
開発データベースで動作するため、コードの問題ではないと思いがちです。しかし、テストデータベースで一貫して問題を再現できます。
この問題を解決するために私が取るべき次のアクションを提案してください
アップデート
いくつかの奇跡により、この C++ 例外は 1 日後になくなりました。しかし、非常に遅いため、ほとんどの場合、実行がタイムアウトします。この行動を正当化する方法がわからない
更新: 2013-07-18
しばらくすると、エラーが再び表示されました。今回は同じSPの開発DBで
[Com error 0x800a0e78 : Operation is not allowed when the object is closed.
同じ行に
while(! rs->ADO_EOF ) {
rs では、ADODB レコードセット オブジェクトを指すメモリ アドレスを確認できます。しかし、rs-> ADO_EOF は上記のエラーを生成しています