C# Microsoft ACE OLEDB连接在有166110行时创建空Excel
我正在用C语言编程,并使用C# Microsoft ACE OLEDB连接在有166110行时创建空Excel,c#,excel,oledb,aceoledb,C#,Excel,Oledb,Aceoledb,我正在用C语言编程,并使用oledbconnection。这是标准连接字符串,例如 using (OleDbConnection conn = new OleDbConnection( "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + saveFilenameAndLocation + ";Extended Properties='Excel 12.0 Xml;HDR=Yes'"
oledbconnection
。这是标准连接字符串,例如
using (OleDbConnection conn = new OleDbConnection(
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
saveFilenameAndLocation +
";Extended Properties='Excel 12.0 Xml;HDR=Yes'"
))
这样可以成功地创建包含正确数据的Excel电子表格,而行数不会过多。但是,每当电子表格中的行数增加到较大的大小时(例如,当前它在166110行上失败),它就会生成一个空的电子表格,工作表选项卡名称设置为A266FF2A662E84b639DA
不可能重写它,使其不使用OLEDB连接,知道行大小增加时它为什么不工作吗?我不确定您的应用程序环境,但我在从ASP.NET应用程序生成Excel文件时看到了这一点 一旦数据量超过一定大小(根据我的经验,大约1MB),提供者将在生成输出时尝试创建一个临时文件。我在64位系统上使用32位提供程序时遇到了这个问题。如果您在具有此配置的服务帐户下运行,则创建这些文件的位置为
C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO
但是,默认情况下,管理员
和系统
只能访问此位置,如果提供程序在非特权帐户下运行,并且无法创建临时文件,则它将以静默方式失败,并仅返回其默认的“空文件”,以及A266FF2A662E84b639DA工作表
您需要做的是沿着路径“C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\tempool\ Internet临时文件”
”授予在(例如网络服务或IIS AppPool\)读取/执行/列出内容权限下运行的应用程序的帐户然后完全访问Content.MSO
文件夹本身
如果提供程序与系统的位匹配,则我怀疑您需要对C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary internetfiles\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应用程序池的“高级设置”中,在搜索google多年后,将“加载用户配置文件””的值从“False”更改为“True”。。。这个答案为我提供了一个解决方案!注意:通常情况下,您无法更改其属性中的临时Internet文件
文件夹的权限。为此,我使用了icacls
:icacls“C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary internetfiles”/授予您的帐户名:RX
。好吧,4年后,ACE.OLEDB仍然处于崩溃状态:-(它试图在非标准位置创建临时文件是多么愚蠢)。