c# - 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 导入它,但这也是关闭的,他们不会启用它,所以这不是一个选项。
解决方案
所以你的问题是下一个。
当您尝试ExecuteReader
DataReader 尝试将所有数据从您的 excel 文件读取到内存中。您可以考虑一下,就像通过 OleDbProvider 使用 excel 的专业一样。
所以我的建议是使用 csv 文件而不是 excel,因为使用 csv 文件,您可以逐行读取和解析它们。为此,我建议您使用CSV 助手
推荐阅读
- jquery - preventdefault inside if 导致表单在 if 为 false 时无法提交
- gremlin - 关于可能不存在的属性值的数学
- javascript - Bootstrap 4 导航栏没有响应并且在设置样式时保持打开状态
- c# - Windows Presentation Foundation 打印标签(斑马打印机)
- powershell - Powershell 找不到部分路径
- html - 当窗口缩小时,如何让项目符号元素与图像保持对齐?
- javascript - Target This 和 Class 没有按预期工作
- amazon-web-services - Glue AWS在boto3 python上创建数据目录表
- javascript - 对 Django 上的 HTTP 请求和 JSON 消息进行故障排除
- javascript - 如何混合 SSR 和 CSR?