2010年1月10日 星期日

Error code: 0x80040E00

不知為什,在SSIS中,當我[OLE DB 來源]使用IBMDA400或IBMDASQL的Provider時,在設計階段不會出錯,但執行時卻會出現如下錯誤訊息(我之前用不會耶...@@)
[OLE DB 來源 [1]] 錯誤: SSIS 錯誤碼 DTS_E_OLEDBERROR。發生 OLE DB 錯誤。錯誤碼: 0x80040E00。
錯誤: SSIS 錯誤碼 DTS_E_PRIMEOUTPUTFAILED。在 元件 "OLE DB 來源" (1) 上的 PrimeOutput 方法傳回錯誤碼 0xC0202009。當管線引擎呼叫 PrimeOutput() 時,元件傳回失敗碼。在此之前可能已公佈過錯誤訊息,說明有關此失敗的詳細資訊。

上網搜尋0x80040E00這Error code會發現這是已知Driver上的bug說,可參考IBM網站的CA400EXP-OLEDB-INCORROUT Error 0x80040E00 in SQLServer SSIS ,我去下載該修正發現得在AS400上更新的樣子,這很麻煩,對我來說行不通

另一個解決辦法是改去微軟Feature Pack for Microsoft SQL Server 2005 - November 2005下載Microsoft OLEDB Provider for DB2來用,這也行不通,因為只支援 Enterprise與Developer版啊

最終我查到的解決辦法就是,捨棄用[OLE DB來源]來連AS400,改用[DataReader 來源]囉,意思就是不能用OLE DB只能用ODBC了

那[DataReader 來源]怎麼用?
a.先參考我這篇AS400如何透過DTS轉入SQL Server2000裡面有提到如何建立系統資料來源

b.建好資料來源後,在[連接管理員]按右鍵選[新增 ADO.NET 連接],再[新增]連接管理員,如下圖,注意要選Odbc Data Provider喔,然後系統資料來源選你建好的,帳號密碼輸入完再按測試看連結有沒有成功,再按[確定]即可建好連接管理員


c.然後再去新增一個[DataReader 來源],在進階編輯器中選剛建好的連接管理員,此例是AS400_cm
d.切換到[元件屬性]頁籤,在[SqlCommand]旁的欄位輸入你要查詢的SQL命令,輸入完畢再去[資料行對應]頁籤去對應一下欄位後,再按[確定]就算完成了
e.這邊要注意一個地方,就是在[輸入與輸出屬性]頁籤的[DataReader輸出],在[外部資料行]那你隨便選一個字串的欄位,你在右邊[通用屬性]那邊可以發現DataType竟然是Unicode字串[DT_WSTR]喔,這是因為DataReader預設將字串當成Unicode的喔,[輸出資料行]也是Unicode,因為本身不支援資料轉換,所以不能改,這意味著你的資料來源確定DataType是NVARCHAR[DT_WSTR],你的目的端也要NVARCHAR[DT_WSTR]喔,要不然你就要在來源與目的中間加個資料轉換,把它轉成VARCHAR[DT_STR]

0 意見:

張貼留言