Microsoft ACE OLEDB 连接在有 166,110 行时创建空 Excel
本文关键字:创建 Excel OLEDB ACE 连接 Microsoft | 更新日期: 2023-09-27 18:33:35
我正在用C#编程并使用oledbconnection
.这是标准连接字符串,例如
using (OleDbConnection conn = new OleDbConnection(
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
saveFilenameAndLocation +
";Extended Properties='Excel 12.0 Xml;HDR=Yes'"
))
这很成功,并在行数不多时创建我的 Excel 电子表格,其中包含正确的数据。但是,每当电子表格中的行数增加到较大时(例如,当前它在 166,110 行上失败(,它就会生成一个空电子表格,工作表选项卡名称设置为 A266FF2A662E84b639DA
。
重写它以使其不使用OLEDB
连接,任何想法为什么当行大小增加时它不起作用?
我不确定您的应用程序环境,但是在从 ASP.NET 应用程序生成Excel文件时,我已经看到了这一点。
一旦数据量超过一定大小(根据我的经验~1 MB(,提供程序将在生成输出时尝试创建临时文件。我在 32 位系统上使用 64 位提供程序遇到了这个问题。如果在具有此配置的服务帐户下运行,则创建这些文件的位置为
C:'Windows'SysWOW64'config'systemprofile'AppData'Local'Microsoft'Windows'Temporary Internet Files'Content.MSO
但是,默认情况下,此位置仅供administrators
和SYSTEM
访问,如果提供程序在非特权帐户下运行并且无法创建临时文件,它将以静默方式失败,并且仅返回其默认的"空文件"与A266FF2A662E84b639DA
工作表。
您需要做的是授予在(例如网络服务或 IIS AppPool''(下运行的应用程序的帐户沿路径"C:'Windows'SysWOW64'config'systemprofile'AppData'Local'Microsoft'Windows'Temporary Internet Files
"读取/执行/列出内容的权限,然后对Content.MSO
文件夹本身具有完全访问权限。
如果提供程序与您系统的位数匹配,那么我怀疑您需要为C:'Windows'System32'config'systemprofile'AppData'Local'Microsoft'Windows'Temporary Internet Files'Content.MSO
执行上述过程,尽管我从未对此进行测试。
我要感谢sysinternals
提供procmon
帮助我解决此问题。
我公司的一名员工今天遇到了这个问题。解决方案很简单:她在 C 上只剩下 20MB 的可用空间: - 如果您在系统驱动器上释放了足够的空间,它应该可以解决问题。
Windows Server 2012R2还要检查文件夹 INetCache 是否存在,并且此文件夹具有完整的外围任务 C:''Windows''SysWOW64''config''systemprofile''AppData''Local''Microsoft''Windows''INetCache
10个小时后,我找到了解决方案。
每 1000 行我们必须关闭并重新打开连接。
样品在这里。
string createTable = "Create Table [Sheet_X] (field1 char(255), field2 char(255),field3 char(255));";
OleDbCommand cmd = new OleDbCommand(createTable, conn);
conn.Open();
cmd.ExecuteNonQuery();
var counter = 0;
foreach (var item in items)
{
if (conn.State == ConnectionState.Closed)
conn.Open();
string insertdata = "insert into [Sheet_X] (field1,field2,field3) values('value1','value2','value3');";
counter++;
if (counter >= 1000)
{
counter = 0;
conn.Close();
}
}
如果在尝试上述所有解决方案后仍然不起作用,请尝试这个解决方案,它对我有用:
在 IIS 应用程序池的"高级设置"中,将">加载用户配置文件"的值从"False"更改为">True"。