当有166,110行时,Microsoft ACE OLEDB连接创build空的Excel

我在C#中编程并使用oledbconnection 。 这是标准的连接string,例如

 using (OleDbConnection conn = new OleDbConnection( "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + saveFilenameAndLocation + ";Extended Properties='Excel 12.0 Xml;HDR=Yes'" )) 

这个工作成功,并创build我的Excel电子表格充满了正确的数据,当行数不是过多。 但是,只要电子表格中的行数增加到较大(例如,当前在166,110行上失败),它就会生成一个空的电子表格,并将工作表选项卡名称设置为A266FF2A662E84b639DA

这是不可能重写这个,所以它不使用OLEDB连接,任何想法,为什么它行不行时,行大小增加?

我不确定你的应用程序环境,但是我从ASP.NET应用程序生成Excel文件时看到了这一点。

一旦数据量超过了一定的大小(根据我的经验大概是1MB),提供者将会在生成输出的时候尝试创build一个临时文件。 我在64位系统上遇到了使用32位提供程序的问题。 如果您使用此configuration在服务帐户下运行,那么这些文件的创build位置是

 C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.MSO 

但是,此位置只能由administratorsSYSTEM默认访问,并且如果提供程序在非特权帐户下运行,并且无法创build临时文件,则它将以静默方式失败,只是返回默认的“空文件” A266FF2A662E84b639DA工作表。

你需要做的是在path“ C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files ”下面(例如Network Service或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从来没有testing过这个。

我想感谢sysinternals提供帮助我解决这个问题的procmon

我公司的一名员工今天遇到了这个问题。 解决scheme很简单:C上剩余空间只有20MB: – 如果在系统驱动器上释放了足够的空间,应该可以解决问题。

Windows Server 2012 R2检查文件夹INetCache是​​否存在,并且此文件夹具有完全权限C:\ Windows \ SysWOW64 \ config \ systemprofile \ AppData \ Local \ Microsoft \ Windows \ INetCache

10个小时后,我find了解决办法。

每隔1000行,我们必须closures并重新打开连接。

样品在这里。

 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(); } } 

如果尝试了以上所有解决scheme后仍然无法正常工作,请尝试下面这个,它对我有用:

在IIS应用程序池的“高级设置”中,将“ 加载用户configuration文件 ”的值从“False”更改为“ True ”。