【茶包射手專欄】ADO.NET開啟Excel傳回未知錯誤0x80004005
3 |
【問題】
使用"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Temp\SomeExcel.xls;Extended Properties='Excel 8.0;HDR=Yes;'"的OleDbConnection方式開啟Excel檔案,在本機執行正常,在Server上卻得到0x80004005錯誤,訊息為"未知的錯誤"
【排除步驟】
- 檢查Server上的目錄,該檔案確實存在。
- 由於0x800004005是典型的Access Denied訊息,但使用Process Monitor監看,卻沒有發現存取檔案/Registry被拒的記錄。
- Google了一下,沒找到完全相符的情境,但有篇文章提到了system32/msexcl40.dll,它是Jet 4.0的相關檔案,註冊失效時會傳回"Could not find installable ISAM"訊息,與本次遇到的訊息並不同,但依該文作者的經驗,雖然訊息不同,但試了有效。所以... 我當然要試試,又不會少塊肉。
- regsvr32 msexcl40.dll後再試,仍然無效。但IISRESET後再試則成功。
由於先後做了regsvr32 msexcel40.dll及IISREST後修復了這個問題,無法確定何者是關鍵(或者兩者都為必須)。為了驗證,regsvr32 /u msexcl40.dll後再試,會得到Could not find installable ISAM,亦非原來的錯誤訊息。
問題解了,但真實原因未能釐清。總之,有相同情境的朋友,不坊試試以上步驟,如有不同發現,歡迎留言回饋給我。
Comments
# by steve
曾經遇到的情況也類似 也是開Excel的問題,但我沒記下錯誤訊息 通常最後都是IISRESET就好了 試著用Debug Diagnostic tool去分析dump 發現都有Memory Fragment的情況 我覺得可能因為程式寫太爛,ADO常常開了沒關 最後導致Memory Fragment,沒有夠大的記憶體區塊給程式放Excel資料 因此才會IISRESET就好了
# by steve
另外,這一篇也有些訊息頗有意思 http://www.wretch.cc/blog/jjgg&article_id=11850315 他的問題是出在%WinDir%\中的temp資料夾的權限 雖然我覺得版大遇到的問題並不是這個 否則不會IISRESET就復原 但讓我聯想到Process Monitor的filter裡面有一些預設的exclude filter 那如果問題是出在這些exclude的系統目錄裏呢?
# by Jeffrey
to steve, ProcMon是否被預設Filter排除掉出錯的Log? 這個點子不錯,剛才仔細看了一下預設的Exclude Filter,倒沒有看到可疑的目錄,預設排除的程式則為system及procmon,procmon是局外人,system應有Local System權限,看來都不像疑犯。 不過,下回有找不到的情形,我會記得朝這個方向思考看看,謝謝囉!