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

Unable to read xlsx file through OleDb with the size more than ~1mb

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

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

有人知道这种行为吗?

P.S。如果文件大小小于上面提到的一切都按预期工作。

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 的访问权限,问题就消失了。