0

データベースからデータを取得した直後に OdbcDataReader を破棄すると、この例外が発生します。リーダーは、Using ブロックを離れるときに実際に破棄されます。私の知る限り、これでエラーが発生することはありません。何か案は?

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at System.Data.Common.UnsafeNativeMethods.SQLFreeStmt(OdbcStatementHandle StatementHandle, STMT Option)
at System.Data.Odbc.CMDWrapper.FreeStatementHandle(STMT stmt)
at System.Data.Odbc.OdbcDataReader.Close(Boolean disposing)
at System.Data.Odbc.OdbcDataReader.Dispose(Boolean disposing)
at System.Data.Common.DbDataReader.Dispose()
at MyNamespace.MyClass.MyFunction() in C:\myfile.vb:line 100

ありがとう!

編集:Sybase ASE 12.5データベースを使用

4

3 に答える 3

0

例外がスローされていDispose()ますか? それともその前?Dispose()投げるのは悪い習慣ですが、前代未聞ではありません。場合によっては (たとえば、WCF を使用して) これらを飲み込むことが望ましい場合もありますが、この場合、エラーは飲み込むべきではないもののように聞こえます。

OdbcDataReader+AccessViolationExceptionをすばやく検索すると、これは珍しいことではありませんが、質問を絞り込むのに十分な情報 (データベース? シナリオ?) がありません。個人的には、いくつかの Google ヒットを調べることから始めます... (おそらく、rdbms によってフィルター処理されます)。

于 2009-01-08T08:08:03.137 に答える
0

一般に、マネージド/アンマネージド インタラクションは、ライフタイム管理に関しては面倒な場合があります。

これは、dispose と、OdbcDataReader 内のファイナライザーとの間の競合状態のように見えます。おそらく、dispose もクリーンアップを試みるアンマネージ オブジェクトを削除しています。おそらく両方とも SQLFreeStmt を呼び出します。

保証を使用してオブジェクトをクリーンアップしますが、そのオブジェクトを存続させることは保証されません。[ファイナライザは、オブジェクトのインスタンス メソッドへの最後の呼び出し中に起動できます。したがって、dispose 呼び出し中にファイナライザーが起動する可能性があります。これが十分に早い段階で発生した場合、破棄する前にファイナライザーが呼び出されたかのようになります。]

これが事実であり、OBDC がブラックボックスである場合、最善の方法は回避策を試みることです。

スコープの使用が終了する前の最後の行に System.GC.KeepAlive(your_DbDataReader_object) を追加してみます。

Dispose とファイナライザーの頭痛の種の完全な概要については、以下を参照してください: GC ディスカッション これは非常に詳細なディスカッションです。

于 2009-01-08T10:21:01.200 に答える
0

おそらく、使用している ODBC ドライバーのバグです。

于 2009-01-08T08:26:34.037 に答える