c# - 无法通过 OleDb 读取大小超过 ~1mb 的 xlsx 文件

标签 c# .net excel oledb

我想使用 sql 批量复制将数据从 *.xlsx 文件加载到数据库。但是,当文件大小超过大约 1mb 时,我遇到了问题。当我尝试打开 OleDbConnection 时出现错误

No error message available, result code: E_FAIL(0x80004005)

有人知道这种行为吗?

附注如果文件大小小于上面提到的,一切都会按预期进行。

string connString = connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0 Xml;";

// Create the connection object 
OleDbConnection oledbConn = new OleDbConnection(connString);
// Open connection
oledbConn.Open();
// Create OleDbCommand object and select data from worksheet
OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + WorkSheetName + "$" + DataRange + "]", oledbConn);
OleDbDataReader dr = cmd.ExecuteReader();

string ProfDbBulkCopyConnString = ConfigurationManager.ConnectionStrings["DbBulkCopyConnString"].ToString();
SqlBulkCopy sb = new SqlBulkCopy(ProfDbBulkCopyConnString);
sb.ColumnMappings.Add("Status", "ActionStatus");
sb.ColumnMappings.Add("Process", "ProcessExec");
sb.DestinationTableName = "dba.Execute";
sb.WriteToServer(dr);

最佳答案

只是修复的简要描述。欲了解更多信息,我建议访问:

本质上,xlsx 格式是某种带有一堆 xml 文件的 zip 存档。因此,首先 ACEOLEDB 提供程序尝试将所有数据直接解压缩到内存缓冲区,但在大型 xlsx 文件提供程序无法将所有数据解压缩到内存缓冲区的情况下,它强制在硬盘驱动器上创建临时文件。如果用户无权访问硬盘驱动器上的 Content.MSO 文件夹,则会出现上述问题。 文件夹路径取决于您的环境。就我而言,它是 C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO(64 位 Windows Server 2008 R2 上的 32 位驱动程序)。 因此,授予用户“IIS AppPool\DefaultAppPool”对 Content.MSO 的访问权限,问题就会消失。

关于c# - 无法通过 OleDb 读取大小超过 ~1mb 的 xlsx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40343344/

相关文章:

c# - 如何设计 Repository 模式以便以后轻松切换到另一个 ORM?

c# - Silverlight - 如何在 XAML 中进行国际化?

.net - 写一个 .txt 文件,没有额外的一行?

c# - 如何更新现有的共享文件夹属性?

用于过滤数据并创建新工作表并向其传输数据的 VBA 代码

excel - 如何用excel vba格式化带小数位的时间?

c# - 如何使功能更强大?

C# Debug.log 在首次启动该方法后停止打印信息

c# - C# 和 Java 应该合并彼此的语法吗?

vba - 将超文本链接从工作簿复制到工作簿