SqlCeConnection应用中的AccessViolation异常处理/代码说明:我的应用是基于c#的,使用SQLServerCE,我只在同一个代码位置两次得到这个异常。在此版本之前,没有引入此异常的崩溃。此版本中的唯一变化是将.net框架更改为4.5.2。在处理带有以下错误的SqlCeConnection时出现访问冲突异常:尝试读取或写入受保护的内存。这通常表示其他内存已损坏。这个异常不会被.net的trycatch子句捕获——它会导致崩溃。在我的代码中,我运行try{varconnectionString=string.Format("{0}{1}{2}","DataSource=",_localDB,";FileMode=ReadWrite;MaxDatabaseSize=4000;PersistSecurity信息=假;”);使用(varsqlCeConnection=newSqlCeConnection(connectionString)){使用(varsqlCeCommand=newSqlCeCommand()){sqlCeCommand.Connection=sqlCeConnection;sqlCeCommand.CommandText="SELECT*FROMApplication";sqlCeConnection.Open();varresult=(string)sqlCeCommand.ExecuteScalar();isValid=!IsValid(结果);}}}catch(Exceptionex){_log.Error("异常",ex);}第一第一:ntdll!zwwaitformultipleObjects+kernelbase!waitformformultipleObjectx+e8kernel32!waitformformultipleobjectsseximplementation+b3kernel32!??::FNODOBFM::`string'+2365ntdll!_C_specific_handler+8cntdll!RtlpExecuteHandlerForException+dntdll!RtlDispatchException+45antdll!KiUserExceptionDispatcher+2esqlcese35!__SafeRelease+csqlcese35!Column::`向量删除析构函数'+5csqlcese35!Object::DeleteObjects+39sqlcese35!Table::`向量删除析构函数'+45sqlcese35!Table::Release+27sqlcese35!HashTable::~HashTable+2asqlcese35!Store::~Store+12bsqlcese35!Store::Release+2asqlceme35!ME_SafeRelease+17DomainBoundILStubClass.IL_STUB_PInvoke(IntPtrByRef)+78[[InlinedCallFrame](System.Data.SqlServerCe.NativeMethods.SafeRelease)]System.Data.SqlServerCe.NativeMethods.SafeRelease(IntPtrByRef)System.Data.SqlServerCe.SqlCeConnection.ReleaseNativeInterfaces()+147System.Data.SqlServerCe.SqlCeConnection.Dispose(布尔值)+f1System_ni!System.ComponentModel.Component.Dispose()+18第二次崩溃的调用栈:ntdll!NtWaitForMultipleObjects+aKERNELBASE!WaitForMultipleObjectsEx+e8kernel32!WaitForMultipleObjectsExImplementation+b3kernel32!WerpReportFaultInternal+215kernelFaultport32!Base17Werpfaultkernel32!Base17Werpportfaultkernel32!32!UnhandledExceptionFilter+1fcntdll!??::FNODOBFM::`string'+2335ntdll!_C_specific_handler+8cntdll!RtlpExecuteHandlerForException+dntdll!RtlDispatchException+45antdll!KiUserExceptionDispatcher+2e+7c88c+1027900x06ccc8980x06f9efc80x1eca80180x1f207400+228dc0x000000040x2edff0080x000000020x000000030x00000004+3fbd90x06ccc898DomainBoundILStubClass.IL_STUB_PInvoke(IntPtrByRef)+78[[InlinedCallFrame](System.Data.SqlServerCe.NativeMethods.SafeRelease)]System.Data.SqlServerCe.NativeMethods.SafeRelease(IntPtrByRef)System.Data.SqlServerCe。SqlCeConnection.ReleaseNativeInterfaces()+147System.Data.SqlServerCe.SqlCeConnection.Dispose(Boolean)+f1System_ni!System.ComponentModel.Component.Dispose()+1b我在网上找到了一些建议,提出了一些解决方案:可能的解决方案:检查对于同一连接上的多线程问题(尝试读取写保护内存,这通常表明其他内存已损坏)拒绝:a。连接是在usingbrackets中创建的,不会被重复使用。b.call方法每5分钟调用一次,并通过转储文件验证它没有被同时调用。可能的解决方案:sqlce版本不匹配(http://blogs.msdn.com/b/sqlservercompact/archive/2009/05/06/troubleshooting-access-violation-exception-while-using-sql-server-compact-database-with-ado-net-provider.aspx)可能的拒绝:我在已安装的版本中看到3.5SP2(3.5.8080.0),并且从转储中的模块中我可以看到sqlceme35.dll,SystemTheversionofthe.Data.SqlServerCe.dllDLL是3.05.8080.0可能的解决方案如下:https://stackoverflow.com/a/20492181/1447518应用程序代码中还有另一个地方正在写入和读取不同的数据库,并且应用程序没有在那里崩溃。我想到的最后一件事可能表明DLL存在卸载问题(查看第二个调用堆栈)。我的猜测是dll是从应用程序中卸载的,应用程序需要它们来进行处理,但它的接缝有点模糊,而且是“远射”我的问题是:什么可能导致问题,什么是可能的解决方案?虽然此解决方案尚未得到验证,但解决方案如下:从第二个调用堆栈中我可以看到正在卸载本机DLL,我的猜测是SQL连接的处置方法正在使用它当前正在处置的方法之一。我通过Processdump验证所有SqlCeConnection类型都在处理中。看到ErikEj的评论让我意识到,如果我查看SQL-CE3.5和4.0之间的代码差异(System.Data.SqlServerCe.dll)会更好。查看代码后,我可以看到deallocated方法被移动到dispose方法中的较后位置。此外,我可以看到在调用SafeRelease之前,还有另一个检查,检查SafeRelease所需的本机DLL是否已被释放-并抛出异常。最重要的是,SQL-CE4.0为同一个问题提供了两种解决方案。我的猜测是问题是由这个引起的。现在的解决方案是让连接在所有应用程序生命周期内保持活动状态(没有连接字符串),这会导致指针池在所有应用程序生命周期内将本机Dll保留在内存中。更好的解决方案是迁移到SQL-CE4.0。以上就是C#学习教程:SqlCeConnection中访问冲突异常处理的全部内容。侵权请点击右侧联系管理员删除。如需转载请注明出处:
