我遇到一个奇怪的工具问题,它应该能够从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的服务器上却没有。这可能是原因吗?
答案 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,所以我只是重新启动了计算机,它的工作原理很简单。