填充DataTable时出现AccessViolationException
本文关键字:AccessViolationException DataTable 填充 | 更新日期: 2023-09-27 18:27:41
我遇到了一个奇怪的工具问题,该工具应该能够从Excel文件中读取数据并将其写入SQL数据库。
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + filename + ";" +
"Extended Properties='"Excel 12.0 Xml;HDR=YES'"";
DataTable dt;
OleDbDataAdapter dataAdapter;
dataAdapter = new OleDbDataAdapter("SELECT * FROM [" + sheet + "$]", strConn);
dt = new DataTable();
try
{
dataAdapter.Fill(dt); //Programm reagiert nicht mehr
}
catch(Exception ex)
{
Logger("Problem filling Adapter: " + ex.ToString());
return null;
}
dataAdapter.Fill(dt)发生以下异常
填充适配器时出现问题:System.AccessViolationException:试图读取或写入受保护的内存。这通常表示其他内存已损坏。位于System.Data.OleDb.DataSourceWrapper.InitializeAndCreateSession(OleDbConnectionString constr,SessionWrapper和SessionWrapper)在System.Data.OleDb.OleDbConnectionInternal.ctor(OleDbConnectionString constr,OleDbConnection连接)位于System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions选项,对象池GroupProviderInfo,DbConnectionPool池,DbConnection owningObject)位于System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup)位于System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)位于System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)位于System.Data.OleDb.OleDbConnection.Open()位于System.Data.Common.DbDataAdapter.FillInternal(数据集数据集,DataTable[]数据表,Int32 startRecord,Int32 maxRecords,字符串srcTable,IDbCommand命令,CommandBehavior行为)位于System.Data.Common.DbDataAdapter.Fill(DataTable[]dataTables,Int32 startRecord,Int32 maxRecords,IDbCommand命令,CommandBehavior行为)位于System.Data.Common.DbDataAdapter.Fill(DataTable DataTable)在ExcelExportWindowsForms.Program.ReadExcel(字符串文件名,字符串表)
有趣的是,这在我的机器(Excel 2013)上运行得很好,但在装有Excel 2003的服务器上却不行。这可能是原因吗?
(来自注释)
在您的评论中,您提到您安装了最新的AccessDatabaseEngine。我在这方面也遇到过问题(当时我发现了很多有同样问题的人的推荐信,但现在已经没有这些链接了)。我不得不使用2010年的版本。如果所有其他版本都失败了,可能需要尝试(您可能必须先卸载其他版本)。原因尚不清楚(对我来说),但可能与x86 v x64安装有关。
使用Microsoft.ACE.OLEDB.16.0(同时尝试32位和64位),System.AccessViolationException
在Windows Server 2012(64位)上多次读取MS Access文件时仍然存在问题。在连接字符串中添加参数OLE DB Services = -1
似乎解决了我的问题。MSDN上对该参数进行了解释并且在CodeProject 上建议进行修复
对我来说,问题是它试图访问的文件被Excel以某种方式锁定,因为我既不能删除也不能移动文件。我第一次尝试打开任务管理器来停止Excel,但在那里找不到Excel,所以我只是重新启动了计算机,这很有魅力。