2012-05-09 55 views
2

我在C#中編程並使用oledbconnection。這是標準的連接字符串,例如當有166,110行時,Microsoft ACE OLEDB連接創建空的Excel

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連接,任何想法,爲什麼它不工作時行大小增加?

回答

4

我不確定您的應用程序環境,但是我從ASP.NET應用程序生成Excel文件時看到了這一點。

一旦數據量超過了一定的大小(根據我的經驗大約1 MB),提供程序將嘗試在生成輸出時創建臨時文件。我在64位系統上使用32位提供程序遇到此問題。如果你是下一個服務帳戶與此配置運行,那麼這些文件被創建的位置是

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

這個位置,但是,僅僅是administratorsSYSTEM默認訪問,如果提供的是下運行非特權帳戶並且無法創建臨時文件,它將以無提示方式失敗,並僅使用A266FF2A662E84b639DA工作表返回其默認「空文件」。

你需要做的是給予帳戶下運行的應用程序(例如網絡服務或IIS應用程序池\)讀/沿着路徑「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幫助我解決了這個問題。

+0

在谷歌搜索後的年齡...這個答案爲我提供了一個解決方案! – KyorCode

+0

注意:通常情況下,您無法更改其屬性中的「Temporary Internet Files」文件夾的權限。我爲此使用了'icacls':'icacls「C:\ Windows \ System32 \ config \ systemprofile \ AppData \ Local \ Microsoft \ Windows \ Temporary Internet Files」/ grant your_account_name:RX'。 – Taosique

+0

好吧,4年後,ACE.OLEDB仍然中斷:-(它對於嘗試在非標準位置創建臨時文件有多愚蠢。 – user1751825

0

我公司的一名員工今天遇到了這個問題。解決方案很簡單:C上只剩下20MB可用空間: - 如果釋放系統驅動器上足夠的空間,它應該可以解決問題。

0

的Windows Server 2012R2 檢查還如果文件夾INetCache存在,這個文件夾具有完全perimissions C:\ WINDOWS \ Syswow64資料\ CONFIG \ systemprofile \應用程序數據\本地\微軟\的Windows \ INetCache

0

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

如果仍然嘗試了以上所有的解決方案後不工作,試試這個,它的工作對我來說:

在你的IIS應用程序池的「高級設置」,改變的價值「 加載用戶配置文件「from」False「to」True「。