gpt4 book ai didi

c# - 服务上的 AccessViolationException

转载 作者:行者123 更新时间:2023-11-30 18:31:46 28 4
gpt4 key购买 nike

我有一个正在运行的服务,它连接到几个客户端。它已经启动并运行了数周,并且该函数每分钟被调用多次,我在不同的函数中遇到了一些问题,但是这个异常让它一直崩溃。我以前从未见过这个问题。谁能让这发生?

堆栈:

Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
at System.Data.OleDb.OleDbServicesWrapper.GetDataSource(System.Data.OleDb.OleDbConnectionString, System.Data.OleDb.DataSourceWrapper ByRef)
at System.Data.OleDb.OleDbConnectionInternal..ctor(System.Data.OleDb.OleDbConnectionString, System.Data.OleDb.OleDbConnection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(System.Data.Common.DbConnectionOptions, System.Object, System.Data.ProviderBase.DbConnectionPool, System.Data.Common.DbConnection)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionPoolGroup)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(System.Data.Common.DbConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory)
at System.Data.OleDb.OleDbConnection.Open()
at EServer.Database.DBManager.DoesObjectExsist(System.String)
at EServer.Database.DBManager.setObjectOnline(System.String, Boolean, System.String, System.String)
at EServer.Network.SocketListener.handleToDo()
at EServer.Network.Token.ProcessData(System.Net.Sockets.SocketAsyncEventArgs)
at EServer.Network.SocketListener.ProcessReceive(System.Net.Sockets.SocketAsyncEventArgs)
at EServer.Network.SocketListener.OnIOCompleted(System.Object, System.Net.Sockets.SocketAsyncEventArgs)
at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(System.Net.Sockets.SocketAsyncEventArgs)
at System.Net.Sockets.SocketAsyncEventArgs.ExecutionCallback(System.Object)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(System.Net.Sockets.SocketError, Int32, System.Net.Sockets.SocketFlags)
at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32, UInt32, System.Threading.NativeOverlapped*)

代码:

public bool DoesObjectExsist(String ID)
{
try
{
String connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + dbPath + "'";
string mySelectQuery = "SELECT * FROM Object WHERE ID = \"" + ID + "\"";

OleDbConnection myConnection = new OleDbConnection(connectionString);
OleDbCommand myCommand = new OleDbCommand(mySelectQuery, myConnection);
myConnection.Open();
OleDbDataReader myReader = myCommand.ExecuteReader();
try
{
while (myReader.Read())
{
return true;
}
}
finally
{
myReader.Close();
myConnection.Close();
}
return false;
}
catch (Exception e)
{
return false;
}
}

最佳答案

EF 核心更新

以下部分有些过时,并且是关于 EF6 和 .NET Framework 4.x 的。如今,如果您使用的是 .NET (Core),请使用 EntityFrameworkCore.Jet EF 核心提供商。使用最新的预发行版,它引用了 5.0.0 OLE DB 库,其中包含一些主要错误修正。

访问冲突异常

此问题是 ACE 2010 引擎中的错误。可以在 original bug report on microsoft connect 中找到解决方法(参见 FranzT):

In my Applicationn I have the same problem. MS Access DB is a backend for this app(C#, .NET 2.0, VS 2005).

When in connection string as provider OLEDB.4.0 is used, it works fine. When the data access provider is ACE.OLEDB.12 I get an Exception if OpenFileDialog is used.

In connection string is possibel to set many parameters, OLE DB Services too.

When OLE DB Services=default (-13, pooling disabled) I get theException. When OLE DB Services=EnableAll (-1, pooling enabled) itworks fine.

If I set OLE DB Services=-2 (EnableAll without pooling) I get the Exception.

My workaround is: set the OLE DB services=-1(EnableAll).

解决方法基于名为 Elmar Boye 的 Microsoft 论坛用户的研究,他详细介绍了问题的性质(虽然是德语):

https://social.msdn.microsoft.com/Forums/de-DE/500055e5-6189-418c-b119-fdc0367e0969/accessviolationexception-bei-openfiledialog-nach-ffnen-und-schlieen-einer-2-form?forum=dotnetframeworkde

基本上,ACE 2010 引擎正在访问它不拥有的内存。如果在引擎访问内存时数据库已经卸载,则抛出异常。要解决此问题,可以使用连接池,因为它使数据库连接保持打开状态,从而使数据库保持在内存中。它可以使用 OLE DB 服务 标志的不同组合来启用。

一个好的标志值是原始默认值,它启用所有服务(尽管这个默认值似乎被注册表项覆盖,这就是为什么在连接字符串中手动提供值是有意义的):

OLE DB 服务=-1

虽然错误报告解决了打开文件对话框中的问题,但根本原因与使用 ACE 2010 访问提供程序的其他 AccessViolationException 案例相同。

还有一个指向 Hotfix 的链接这应该可以解决问题。

顺便说一句,使用 Microsoft.Jet.OLEDB.4.0 提供程序不会发生此异常。

JetEntityFrameworkProvider

对于像我这样使用 JetEntityFrameworkProvider by bubibubi 的人确保您在生产连接字符串中使用变通方法,而不是在用于应用数据库迁移的连接字符串中使用变通方法,因为它会在第二个更新数据库上抛出 OleDbException E_UNEXPECTED(0x8000FFFF)命令,同时尝试打开数据库,并将在之后的每个命令执行时锁定程序包管理器控制台(直到您重新启动 Visual Studio)。

访问和多用户场景

Access 是为通过网络共享同时进行多用户访问而构建的。所以这是一个明确支持的场景。@Hans Passant 和@user2905764

关于c# - 服务上的 AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19516640/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com