No error message available, result code: E_FAIL(0x80004005)
做上傳Excel文件這個功能的時候,遇到個奇怪的事情。
我的程序里上傳Excel文件的過程是這樣的:
1.將用戶選擇上傳的文件保存到服務器上
2.使用?Provider=Microsoft.Ace.OLEDB.12.0 打開這個文件,然后讀取文件內容,加載到DataTable里
關鍵在于上面第2步,本地開發環境怎么debug都是沒問題的;一旦發布到服務器上,文件size小一點的沒有問題,大于大約1M的話,就會報錯,
錯誤有2個(不是同時出現):
a)?external table is not in the expected format
b)?No error message available, result code: E_FAIL(0x80004005)
?
上面第2步里,關鍵代碼如下:
View Code string strConn = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=Excel 12.0 Xml;";OleDbDataAdapter oda = new OleDbDataAdapter("select * from [Sheet1$]", strConn);DataSet ds = new DataSet(); oda.Fill(ds); //error?
后來,在Provider里加了HDR=Yes; IMEX=1,問題居然解決了,代碼如下:
View Code string strConn = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" + filename + ";Extended Properties=\"Excel 12.0 Xml;HDR=Yes;IMEX=1\";";?
查了一下微軟官方的資料,找出了HDR, IMEX的相關解釋:
HDR,即Header Row,HDR=Yes則表明Excel文件里第一行作為header,不作為數據考慮。比如,把Excel文件里數據讀入到DataTable,HDR=Yes,則Excel文件里第一行作為這個DataTable的字段名。HDR的Default值是Yes。
IMEX,即Import/Export Mode,IMEX的Default值是2(?待確定)有3種:
IMEX=0 is Export mode //Write Only
IMEX=1 is Import mode //Read Only
IMEX=2 is Linked mode (full update capabilities) //Read/Write
?
當IMEX=1時,即Import Mode,在讀取Excel文件時,如果該文件的某列存在Mixed Data的情況(比如數字和字符串結合的情況:CN123),會把該單元格里的值的類型轉換成注冊表里ImportMixedTypes(win7路徑:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel)的值。比如ImportMixedTypes=text,則把CN123的類型轉成text型,這樣,就不會出現異常情況了(當然還要考慮TypeGuessRows,這里不贅述)。
?
當IMEX=0或2時,在讀取Excel文件時,會忽略掉注冊表里的ImportMixedTypes,轉而以MajorityType類型返回單元格里的數據。
?
TypeGuessRows,ImportMixedTypes需要在注冊表里手動更改。ImportMixedTypes共有兩種類型:MajorityType和Text,它的Default值是Text。
?
我遇到的問題雖然解決了,但還是沒搞清楚問題的癥結:
在沒有加HDR=Yes; IMEX=1時,文件size大約小于1M的話,功能是沒問題的(列里有Mixed Data情形);
當大于1M的時候,只有加上HDR=Yes; IMEX=1,功能才正常。
?
?參考資料:
http://support.microsoft.com/kb/257819
http://office.microsoft.com/en-us/access-help/initializing-the-microsoft-excel-driver-HP001032159.aspx
http://www.instantpages.ltd.uk/ADODB_WP.htm
轉載于:https://www.cnblogs.com/bobliu/archive/2012/07/05/2573460.html
總結
以上是生活随笔為你收集整理的No error message available, result code: E_FAIL(0x80004005)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows7跑星际争霸问题解决——为
- 下一篇: 和菜鸟一起学c++之虚函数