2012年4月23日 星期一

使用IBM DB2 ODBC DRIVER,來建立DB2的連結伺服器

        如果想利用SQL Server來連結DB2,強烈不建議使用Microsoft OLE DB Provider for DB2喔!

        因為光是搞HostCCSID與PC code page這兩個編碼屬性我就快瘋了,弄了兩天我還是搞不定,不是中文顯示問號,就是變亂碼,再不然就是出錯,從1.0試到3.0,中英文版都試了也一樣

         後來使用Microsoft OLE DB Provider for DB2的資料存取工具去試試看到底支援哪些編碼,明明有950的啊,但偏偏設了就會出錯

錯誤一
         無法連接至資料來源 'DB2TEST':
        發生內部網路程式庫錯誤。要求命令包含了目標系統無法辨識,或不支援的參數值。         SQLSTATE: HY000, SQLCODE: -385
錯誤二
        無法連接至資料來源 'DB2TEST':
        處理命令時,發生一或多個錯誤。

        就在我要放棄的時候,我改用IBM DB2 ODBC DRIVER看看,結果上面那兩個屬性我根本不用設就OK了,中文顯示都很正常喔,真是白白浪費我兩天時間啊

1. 首先請安裝DB2 Client

2.在命令列下輸入odbcad32,在[系統資料來源]下建立新資料來源,選[IBM DB2 ODBC DRIVER],按下[完成]


3.[資料來源名稱]輸入db2,按下[新增]


4. 輸入欲連結的DB2 Server資訊後,按下[確定]


5.建立完後可以看到如下的系統資料來源db2,可以按下[設定]去測試一下設定是否正確


6.輸入帳密後,按下[連接]看會不會不會跳出[連線測試成功],若有就OK囉


7.回到SSMS,先檢查一下連結的伺服器的提供者有沒有多了預設的PROGID
[IBMDADB2.DB2COPY1]


8. 建立連結伺服器,並建立與連結伺服器帳戶對應
EXEC master.dbo.sp_addlinkedserver
   @server = N'DB2TEST',
   @srvproduct=N'IBM ODBC Provider for DB2',
   @provider=N'IBMDADB2.DB2COPY1',
   @datasrc=N'db2',
   @provstr=N'Data Source=db2'

GO
EXEC   sp_addlinkedsrvlogin   @rmtsrvname   =   'DB2TEST',  
   @useself   =   'false ',   
   @rmtuser   =   'test',  
   @rmtpassword   =   'test'
GO

9. 我們已建立好db2的連結伺服器,來查一下db2上面的資料吧,這裡介紹三種查詢連結伺服器的方法(此例是以TESTDB目錄下,有個結構描述DB1的TESTTABLE資料表)

--1 SELECT
SELECT  PRODUCT_CODE,CHANGE_TIME   FROM   DB2TEST.TESTDB.DB1.TESTTABLE

SELECT  PRODUCT_CODE,CHANGE_TIME   FROM   DB2TEST.TESTDB.DB1.TESTTABLE
WHERE PRODUCT_CODE = N'測試'

--2OPENQUERY
SELECT * FROM OPENQUERY (DB2TEST, 'SELECT  PRODUCT_CODE,CHANGE_TIME  FROM  TESTDB.DB1.TESTTABLE')

SELECT * FROM OPENQUERY (DB2TEST, 'SELECT  PRODUCT_CODE,CHANGE_TIME  FROM  TESTDB.DB1.TESTTABLE WHERE PRODUCT_CODE = ''測試''')

--3EXEC
EXEC ('SELECT PRODUCT_CODE,CHANGE_TIME FROM TESTDB.DB1.TESTTABLE') AT DB2TEST

EXEC ('SELECT PRODUCT_CODE,CHANGE_TIME FROM TESTDB.DB1.TESTTABLE WHERE PRODUCT_CODE = ?','測試') AT DB2TEST

         訊息7411,層級16,狀態1,行1
         並未為RPC 設定伺服器'DB2TEST'

          如果用EXEC遇到上面錯誤,請執行以下命令即可解決

exec sp_serveroption @server='DB2TEST', @optname='rpc', @optvalue='true'
exec sp_serveroption @server='DB2TEST', @optname='rpc out', @optvalue='true'

10.其他對連結伺服器執行新增、修改刪除的語法如下

--新增
INSERT DB2TEST.TESTDB.DB1.TESTTABLE VALUES(N'測試看看','2012-04-23','2012-04-23 11:22:45.000')

--刪除
DELETE FROM DB2TEST.TESTDB.DB1.TESTTABLE WHERE PRODUCT_CODE = 'test'

--修改
UPDATE DB2TEST.TESTDB.DB1.TESTTABLE SET PRODUCT_CODE = N'test試試' WHERE PRODUCT_CODE = 'test'

--以下這種IBM DB2不支援這樣用,會出現如下錯誤,得用MS DB2喔
INSERT OPENQUERY (DB2TEST,'SELECT PRODUCT_CODE,CHANGE_DATE,CHANGE_TIME FROM TESTDB.DB1.TESTTABLE')
VALUES('試試吧','2012-04-23','2012-04-23 11:22:45.000')

訊息7320,層級16,狀態2,行1
無法對連結伺服器"DB2TEST" OLE DB 提供者"IBMDADB2.DB2COPY1" 執行查詢"SELECT PRODUCT_CODE,CHANGE_DATE,CHANGE_TIME FROM TESTDB.DB1.TESTTABLE"。提供者無法支援UPDATE/DELETE/INSERT 陳述式所需的介面。提供者指出和其他屬性或需求發生衝突。提供者無法支援這個資料表的插入。提供者指出和其他屬性或需求發生衝突。

2 則留言:

  1. 大大的作法是連接到AS400上嗎?
    目前在研究SQL server連接到AS400 DB2上撈取資料並可以修改的方法,大大是否能提供協助?

    回覆刪除
    回覆
    1. 此例是連到R6上的DB2,連AS400的方法差不多,只是用的DRIVER不一樣,可參考我blog裡關於AS400的幾篇文章。另外這樣作效能都不會多好喔,我這樣做都是轉檔需要,利用離峰時間處理的。

      刪除