C# 填充数据表时出现AccessViolationException异常
我在使用一个工具时遇到了一个奇怪的问题,它应该能够从Excel文件中读取数据并将其写入SQL数据库C# 填充数据表时出现AccessViolationException异常,c#,sql,access-violation,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\"";
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 connection)
在System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions选项、对象池组ProviderInfo、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(数据集数据集,数据表[]数据表,Int32 StartRecords,Int32 maxRecords,字符串srcTable,IDbCommand命令,CommandBehavior)
位于System.Data.Common.DbDataAdapter.Fill(DataTable[]dataTables,Int32 StartRecords,Int32 maxRecords,IDbCommand命令,CommandBehavior)
位于System.Data.Common.DbDataAdapter.Fill(DataTable)
在ExcelExportWindowsForms.Program.ReadExcel(字符串文件名、字符串表)
有趣的是,这在我的机器(Excel2013)上运行得很好,但在装有Excel2003的服务器上却不行。这可能是原因吗
在您的评论中,您提到您安装了最新的AccessDatabaseEngine。我在这方面也遇到了问题(当时我找到了很多有同样问题的人的参考资料,但是没有这些链接了)。我不得不使用2010版。如果其他所有操作都失败,可能需要尝试(您可能必须先卸载其他版本)。
原因尚不清楚(对我来说),但可能与x86 v x64安装有关。使用Microsoft.ACE.OLEDB.16.0(尝试32位和64位),System.AccessViolationException在Windows Server 2012(64位)上多次读取MS Access文件仍然是个问题。 将参数
oledb Services=-1
添加到连接字符串似乎可以解决这个问题。
有关参数的说明,请参见
对我来说,问题是它试图访问的文件被Excel以某种方式锁定了,因为我无法删除或移动该文件。我第一次尝试打开任务管理器来停止Excel,但在那里找不到Excel,所以我只是重新启动了计算机,这很有魅力。您正在使用Excel 2003的Excel 2013连接字符串,是的,这可能是原因。请尝试
Extended Properties=“Excel 8.0;”
也可能只有较旧版本的数据访问驱动程序可用。您也需要更改提供程序。请检查所有可能的连接字符串是否存在32/64位冲突?是否可以检查[此答案][()。您提到您安装了最新的AccessDatabaseEngine。我也遇到了一些问题(当时我发现很多人都有相同的问题,但没有这些链接)。我不得不使用2010版本。如果其他版本都失败,可能需要尝试一下(您可能必须先卸载其他版本)@xileb0,很高兴能帮上忙。回答补充。