0

私のプロジェクトは C++/MFC で書かれており、CDatabase と CRecordset を使用してデータベースにアクセスしています。時折、MS SQL サーバーがダウンして、データベースへの接続が切断されることがあります。その場合は、再接続する必要があります。切断を検出するのは非常に難しいことがわかっています。アプリケーションを実行し、MS SQL サーバーを停止してテストします。

この関数CDatabase::IsOpen()は、MS SQL がダウンし、接続が切断され、MFC がデータベースが閉じられたことを示す例外をスローした後でも、データベースが開いていることを常に報告します。自分のコードで CDatabase::Close() を実行した後でのみ、IsOpen() が「false」を返し始めます。

そのため、データベース接続を閉じてから再度開く必要がある条件を検出する必要があります。Microsoft は、タイプ CDBException のオブジェクトをスローします。を呼び出すとCDBException::GetErrorMessage()、例外を詳細に説明する文字列が返されます。しかし、CDBException::m_nRetCode の値を調べると、常に -1 が含まれています。

データベース接続が失われたかどうかを判断するには、CDBException::m_nRetCode の明確に定義された整数値に依存することをお勧めします。代わりに、CDBException::m_strError で文字列 "Communication link failure" を探します。

返されたエラー文字列を解析して例外の種類を特定する必要はありません。m_nRetCode で -1 を取得している理由を誰か知っていますか? 切断を確実に確認する方法があるかどうかは誰にもわかりませんか?

4

1 に答える 1

0

残念ながら、CDatabase::IsOpen() は、接続の現在の状態ではなく、先行する CDatabase::Open() 呼び出しが成功したかどうかを返すだけです。

::SQLError() のドキュメントと CDBException::BuildErrorString() のソースを見ると、SQL エラーは複雑なものであることがわかります。ただし、CDBException::BuildErrorString() のブレークポイントがおそらく解決策につながると思います。

ps。このアプローチが役に立った場合は、私も必要になるかもしれないので、最終的なコードを投稿していただけますか?

于 2013-11-08T03:23:54.373 に答える