首页 > 解决方案 > C#通过OleDBDataReader从大型excel文件批量复制抛出内存异常

问题描述

我有一个大的 excel 文件(530K 行有很多列)。最终为 .xlsb 格式的 247MB。我正在尝试使用 C# 中的 BulkCopy 导入 SQL Server,但是我遇到的问题是,一旦我运行 ExecuteReader() 命令,数据读取器甚至在开始读取文件之前就耗尽了内存。

string exlConnString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={_filepath};Extended Properties=\"Excel 12.0;HDR=YES;\"";
string sqlQuery = $"SELECT * FROM [{SheetName}]";
using OleDbConnection conn = new OleDbConnection(_connstring)) {    
   OleDbCommand exlCmd = new OleDbCommand(sqlQuery, conn)
   conn.Open();
   OleDbDataReader dr = exlcmd.ExecuteReader(); <---NEVER GETS PAST THIS LINE BEFORE RUNNING OUT OF MEMORY.
   SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnString);
   bulkCopy.DestinationTable = TableName;
   while(dr.Read()) {
      bulkcopy.WriteToServer(dr);
   }
   dr.Close();
}

我在 x86 模式下运行,因为我收到一个错误,即我的本地计算机上没有安装 ACE 数据库,并且公司政策限制阻止我下载和安装所需的文件以在 x64 模式下运行它。

当我在较小的文件上测试代码时,代码工作得非常好,但当我在这个更大的文件上测试它时,代码工作得很好,所以它肯定是导致问题的文件大小。任何建议或帮助将不胜感激。当批量复制用于处理大量数据时,它会耗尽内存并没有多大意义,这也意味着文件大小也会很大......

是的,我知道我应该能够在 SQL Server 中使用 OPENROWSET 或 OPENDATASOURCE 导入它,但这也是关闭的,他们不会启用它,所以这不是一个选项。

标签: c#excelsqlbulkcopy

解决方案


所以你的问题是下一个。

当您尝试ExecuteReader DataReader 尝试将所有数据从您的 excel 文件读取到内存中。您可以考虑一下,就像通过 OleDbProvider 使用 excel 的专业一样。

所以我的建议是使用 csv 文件而不是 excel,因为使用 csv 文件,您可以逐行读取和解析它们。为此,我建议您使用CSV 助手


推荐阅读