0

I am getting this exception when disposing an OdbcDataReader just after retrieving data from the database. The reader is actually disposed while leaving a Using block. This should not be causing any errors as far as I know. Any ideas?

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

Thanks!

EDIT: using Sybase ASE 12.5 database

4

3 回答 3

0

是否抛出异常Dispose()?还是在那之前?投掷是不好的做法Dispose(),但并非闻所未闻。有时(例如,使用 WCF)需要吞下这些,但在这种情况下,错误听起来像是不应该被吞下的东西。

快速搜索OdbcDataReader+AccessViolationException表明这并不少见 - 但问题中没有足够的信息(数据库?场景?)来缩小范围。就个人而言,我会首先查看一些谷歌点击...(可能由您的 rdbms 过滤)。

于 2009-01-08T08:08:03.137 回答
0

可能是您正在使用的 ODBC 驱动程序中的一个错误。

于 2009-01-08T08:26:34.037 回答
0

一般来说,在生命周期管理方面,托管/非托管交互可能会很麻烦。

这看起来像是 OdbcDataReader 内的 dispose 和终结器之间的竞争条件,它可能正在删除一些 dispose 也尝试清理的非托管对象。他们可能都调用 SQLFreeStmt。

使用保证来清理对象 - 但它不能保证让该对象保持活动状态。[终结器可以在最后一次调用对象的实例方法期间启动。因此终结器可以在 dispose 调用期间启动。如果这发生得足够早,就好像在 dispose 之前调用了终结器。]

如果这是真的,并且如果 OBDC 对您来说是一个黑匣子,那么您能做的最好的事情就是尝试一种解决方法。

我会尝试在使用范围结束之前的最后一行添加一个 System.GC.KeepAlive(your_DbDataReader_object) 。

有关 dispose 和 finalizers 令人头疼的完整概述,请参阅:GC 讨论 这是一个非常详细的讨论。

于 2009-01-08T10:21:01.200 回答