填充DataTable

时间:2015-12-22 13:45:45

标签: c# sql access-violation

我遇到一个奇怪的工具问题,它应该能够从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选项,Object poolGroupProviderInfo,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(DataSet数据集,DataTable [] datatables,Int32 startRecord,Int32 maxRecords,String 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(String filename,String sheet)

有趣的是,这在我的机器上完美运行(Excel 2013),但在使用Excel 2003的服务器上却没有。这可能是原因吗?

3 个答案:

答案 0 :(得分:1)

(来自评论)

在您的评论中,您提到您安装了最新的AccessDatabaseEngine。我也遇到过这方面的问题(当时我发现很多人都有相同的问题,但不再有这些链接)。我不得不使用2010版。如果所有其他方法都失败了,可能会尝试一下(您可能必须首先卸载其他版本)。 原因尚不清楚(无论如何),但它可能与x86 v x64安装有关。

答案 1 :(得分:0)

使用Microsoft.ACE.OLEDB.16.0(尝试32位和64位),System.AccessViolationException仍然是在Windows Server 2012(64位)上多次读取MS Access文件的问题。 在连接字符串中添加参数OLE DB Services = -1似乎可以解决此问题。 参数在MSDN中有解释 并在CodeProject

上建议了此修复程序

答案 2 :(得分:0)

对我来说,问题在于它试图访问的文件被Excel某种程度地锁定,因为我既无法删除也无法移动该文件。我首先尝试打开任务管理器以暂停Excel,但是在那里找不到Excel,所以我只是重新启动了计算机,它的工作原理很简单。