2020年2月1日 星期六

Views

[開發問題] 'Microsoft.ACE.OLEDB.12.0' 提供者並未登錄於本機電腦上


    最近開發.NET Webform ImportExcel遇到如題的問題,為了解決這個問題,大概撞了四天牆。謝天謝地!我還是透過網路上分享的資訊,撞破這道牆,還是得紀錄下來,不然很快又忘記了。

問題解決過程:

(1)為什麼一直出現這個問題?
 網路上有一面倒的資訊是說,連線字串錯誤,確實我自己也是因為連線字串DataSource路徑出錯,不過網路上的網友比較沒提到這塊,每個人犯錯地方不一樣就東試試西試試這樣,以上題供正確寫法,大家在參考看看
/*取得EXCEL上傳的路徑*/
   string _conn = "Provider=Microsoft.ACE.OLEDB.12.0;"
                  + "Extended Properties='Excel 12.0;HDR=NO;IMEX=1';"  
                  + "Data Source=D:\\Demo\\test.xlsx";//每個人不一樣                       
                 
HDR ( HeaDer Row )若指定值為 Yes,代表 Excel 檔中的工作表第一列是欄位名稱,若指定值為 No,代表 Excel 檔中的工作表第一列就是資料了,沒有欄位名稱。

IMEX 有三種模式,分別讀寫行為也不同。
0 is Export mode
1 is Import mode

Extended Properties='Excel 12.0'這個是固定寫法,不要隨便改變,我當初還想說是不是Excel對應版本不同,所以這邊寫法要變,錯錯錯!!!!!
目前Excel 2007~2016都是寫這個啊!不要亂改。

(2)連線字串改過後為什麼還是錯?
 網路上還有一說法,就是windows灌的版本不同,和office版本不同才會出現問題,確實這個也是影響點(但是目前電腦都是64位元,所以只要知道自己office的版本,灌對應套件就可以解決問題了,網路舊資訊寫得太模糊了)。
先檢查作業系統我的是 windows 10 和 office 2016 32位元(我一直以為是64位元),導致我在灌Microsoft Access Database Engine 2010 可轉散發套件選64位元還是一直出錯。因為網路很多資訊都是片段,我東試試西試試也還是試不出來。
目前資訊如下(以我的作業環境解釋):
如果Provider=Microsoft.ACE.OLEDB.12.0 就要灌Microsoft Access Database Engine 2010 32位元版本
如果Provider=Microsoft.ACE.OLEDB.15.0 就要灌Microsoft Access 2013 Runtime 32位元版本,取決連線字串的寫法,去對應你要灌什麼軟體。基本上都可以打開xlsx檔案(目前我的office 2016測試過都沒問題)。

(3)綜合上述
1.出錯先檢查作業系統和office版本,去找office版本對應的套件如(2)所述
2.檢查連線字串每一個寫法,確保正確性,不然還是會出現如題的錯誤。
3.會記錄這篇原因:目前網路上解決資訊都太舊了,我相信這個老掉牙問題,還是會卡住新手的。
4.如果有路過的民眾參考了我的作法,可以留言給我,看看是否有成功解決問題,或是我有寫錯地方都可以跟我分享。

沒有留言:

張貼留言