.net OdbcDataReader.Dispose()上的AccessViolationException异常

.net OdbcDataReader.Dispose()上的AccessViolationException异常,.net,access-violation,.net,Access Violation,我在从数据库检索数据后处理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.UnsafeNativeM

我在从数据库检索数据后处理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数据库是否在Dispose中引发异常?还是在那之前?抛掷是一种不好的做法,但并非闻所未闻。例如,有时我们希望接受这些错误,但在这种情况下,错误听起来像是不应该接受的东西


快速搜索显示,这并不罕见,但没有足够的信息数据库?脚本在这个问题上,我们必须缩小范围。就我个人而言,我会先看看谷歌的一些搜索结果。。。可能是由您的rdbms过滤的。

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

在一般情况下,当涉及到生命周期管理时,托管/非托管交互可能会很麻烦

这看起来像是dispose和OdbcDataReader中的终结器之间的竞争条件,该终结器可能正在删除dispose还试图清理的某些非托管对象。 它们可能都称为SQLFreeStmt


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

如果这是真的,如果OBDC的东西对你来说是一个黑盒子,那么你能做的最好的事情就是尝试一种变通方法

我将尝试在使用范围结束前的最后一行添加System.GC.KeepAliveyour_DbDataReader_对象

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

来自stacktrace:它在Disposeb中,但不能保证该对象保持活动状态。-你能证明这一点吗?为了调用Dispose,仍然必须在作用域中考虑变量;有一个关于变量的读取,所以在那之后才应该收集它…?我用一个好的链接更新了我的帖子,以了解更多细节,并澄清了我的意思-我希望这有帮助。你解决过你的问题吗?它随机发生了几次,然后停止了,我没有做任何更改。。。在我看来完全是随机的。