[SQL][SSIS]匯出資料到 Excel 2007 失敗 ?

[SQL][SSIS]匯出資料到 Excel 2007 失敗 ?

中午休息時間才剛想到小睡片刻的時候,忽然電話鈴聲響了,一位服務人員在處理客戶資料的時候有問題,需要把資料轉成 Excel 2007 的格式,但是利用 SQL Server 的匯出資料( Export Data ) 操作的時候,都會出現 "The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. (System.Data)" 的錯誤訊息,但如果是匯出到 Excel 2003 的格式就正常。在描述問題的時候,服務人員表示也有上 google 去找答案,也按照說明安裝了 Access Database Engine 2010 並且也重開機過了,但是還是會失敗,於是就接手幫忙了解一下問題。

 

選擇畫面 :

SSIS003

錯誤訊息 :

SSIS002

 

連線查看了一下,問題應該也還算好處理,主要是因為 Microsoft Access Database Engine ( 網址 ) 有區分 X86 和 X64 的兩個版本,雖然客戶端的環境是 Windows Server 2008 R2 X64 的版本,但是當在 SSMS 上面使用 Export 的時候,他並沒有啟用 64 位元的執行環境,才會有這樣的問題。因此我做了一個簡單的實驗,利用 SSDT 先手動建立一個從 SQL Server 匯出到 Excel 的 Package,

image

 

這樣執行上面沒有問題,但是如果我們這個時候來調整參數,把 "Run64BitRuntime" 的屬性給設定為 False 的話,則這個時候再重新執行一次。

SSIS001

 

就會在 Output 的地方看到跟匯出資料的時候所發生的錯誤訊息類似

 

Error: 0xC0209302 at Excel, Connection manager "DestinationConnectionExcel": The requested OLE DB provider Microsoft.ACE.OLEDB.12.0 is not registered. If the 32-bit driver is not installed, run the package in 64-bit mode. Error code: 0x00000000.
An OLE DB record is available.  Source: "Microsoft OLE DB Service Components"  Hresult: 0x80040154  Description: "類別未登錄".
Error: 0xC001002B at Excel, Connection manager "DestinationConnectionExcel": The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. For more information, see http://go.microsoft.com/fwlink/?LinkId=219816

因此這個時候我們重新在客戶端的主機上,加裝 Microsoft Access Database Engine X86 的版本的話,再重新執行一次上述的所有動作,就都沒有問題了。雖然浪費了中午休息時間,但也順便多學到一個 SSIS 32 位元和 64 位元環境執行上所需要考量的地方,算是不錯的收穫了。

 

備註 : 謝謝一些朋友來信討論,的確我這篇上有點沒有交代清楚,在 SSDT 上面因為他本身是 32 位元的作業,因此在設計階段的時候,如果沒有 32 位元的驅動程式,則會無法正常設定。但是在執行的時候,則是看專案上設定的偵錯屬性,來決定是否是在 64 位元環境下執行,因此最好的方式就是要同時安裝 32 位元和 64 位元的驅動程式