填充 DataTable 时出现 AccessViolationException 异常

3

我在使用一款工具时遇到了奇怪的问题,该工具应该能够从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:尝试读取或写入受保护的内存。这通常是其他内存损坏的指示。 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, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.OleDb.OleDbConnection.Open() at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at ExcelExportWindowsForms.Program.ReadExcel(String filename, String sheet)

有趣的是,在我的电脑上(Excel 2013)完美运行,但在安装了Excel 2003的服务器上却无法运行。这可能是原因吗?


2
你正在使用 Excel 2013 的连接字符串来连接 Excel 2003,是的,这可能是原因。尝试使用 Extended Properties="Excel 8.0; - HoneyBadger
1
可能只有较旧版本的数据访问驱动程序可用。您可能还需要更改提供程序。请查看连接字符串https://www.connectionstrings.com/excel-2003/,了解所有可能性。 - dbugger
1
可能是32/64位冲突吗?你能检查一下这个答案吗?(https://dev59.com/cGct5IYBdhLWcg3wL6ui#14982382) - rene
1
你提到你安装了最新的AccessDatabaseEngine。我也遇到过这个问题(当时我找到了很多人有同样的问题的参考资料,但现在没有这些链接了)。我不得不使用2010版本。如果其他方法都失败了,可以尝试一下(你可能需要先卸载其他版本)。 - HoneyBadger
1
@xileb0,很高兴能够帮助。已添加答案。 - HoneyBadger
显示剩余12条评论
3个回答

3

(来自评论)

在您的评论中,您提到安装了最新的AccessDatabaseEngine。我也遇到过这个问题(当时我找到了很多人有同样的问题的参考,但现在没有那些链接了)。我不得不使用2010版本。如果其他方法都失败了,可以尝试一下(可能需要先卸载其他版本)。 原因对我来说不太清楚,但可能与x86 v x64安装有关。


1
使用Microsoft.ACE.OLEDB.16.0(尝试32位和64位),在Windows Server 2012上多次读取MS Access文件时仍然存在System.AccessViolationException问题。 将参数OLE DB Services = -1添加到连接字符串中似乎解决了我的问题。 该参数在MSDN上有解释, 并且修复建议出现在CodeProject上。

0
对我来说,问题在于它试图访问的文件被Excel锁定了,因为我既无法删除也无法移动该文件。我首先尝试打开任务管理器停止Excel,但是在那里找不到Excel,所以我只好重新启动电脑,这非常有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接