C# 第二次通过OLEDB连接连接到Excel文件时,我得到:AccessViolationException:';试图读取或写入受保护内存“;
我见过其他类似的帖子,但没有一篇能帮我解决问题 第一次打开连接时没有问题,然后使用该连接从文件中获取信息,然后关闭文件。很多时候,用户会想重复这个动作,第二次出现标题中的例外情况 下面是调用它的代码:C# 第二次通过OLEDB连接连接到Excel文件时,我得到:AccessViolationException:';试图读取或写入受保护内存“;,c#,.net,excel,oledb,C#,.net,Excel,Oledb,我见过其他类似的帖子,但没有一篇能帮我解决问题 第一次打开连接时没有问题,然后使用该连接从文件中获取信息,然后关闭文件。很多时候,用户会想重复这个动作,第二次出现标题中的例外情况 下面是调用它的代码: public virtual void Open() { CheckConnection(); Connection.Close(); Connection.ConnectionString = Connec
public virtual void Open()
{
CheckConnection();
Connection.Close();
Connection.ConnectionString = ConnectionString;
Connection.Open();
}
其中,连接
的类型为OLEDB连接
以下是堆栈跟踪的相关部分:
at System.Data.OleDb.DataSourceWrapper.InitializeAndCreateSession(OleDbConnectionString constr, SessionWrapper& sessionWrapper)
at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()
最后是我第一次关闭连接的代码
Connection.Close();
Connection.Dispose();
OleDbConnection.ReleaseObjectPool();
GC.Collect();
请注意,我遵循以下步骤:
接近。处置释放池。调用GC()
而我仍然在努力
System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'
我怀疑它并没有放弃文件连接,但我想可能是其他原因
编辑:这也是我当前使用的连接字符串(尽管我尝试了很多):
这也是我在评论中写的:嗯……如果我在第二次打开连接之前设置了断点,我可以进入文件浏览器手动打开文件,如果OLEDB连接控制了文件,我认为我无法做到这一点。我不知道这是否有帮助,但您可以尝试添加一个调用,也许
ReleaseObjectPool
有一个尚未运行的终结器。脱离主题:为什么在关闭前检查连接,而在关闭时不捕获错误?检查连接只是检查如果连接对象存在,则抛出异常(如果不存在)。关闭我认为是一个预防措施(我没有写那些代码行)@pstrjds不起作用,但值得一试嗯..如果我在第二次打开连接之前设置了一个断点,我可以进入文件资源管理器手动打开文件,如果oledbconnection控制了该文件,我认为我无法做到这一点
Provider=Microsoft.ACE.OLEDB.16.0;Data Source='C:\Users\Jacob\Documents\book1.xlsx';OLE DB Services=-2;Extended Properties='Excel 8.0';