因為光是搞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'測試'
--2 用OPENQUERY
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 = ''測試''')
--3 用EXEC
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遇到上面錯誤,請執行以下命令即可解決
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 陳述式所需的介面。提供者指出和其他屬性或需求發生衝突。提供者無法支援這個資料表的插入。提供者指出和其他屬性或需求發生衝突。
大大的作法是連接到AS400上嗎?
回覆刪除目前在研究SQL server連接到AS400 DB2上撈取資料並可以修改的方法,大大是否能提供協助?
此例是連到R6上的DB2,連AS400的方法差不多,只是用的DRIVER不一樣,可參考我blog裡關於AS400的幾篇文章。另外這樣作效能都不會多好喔,我這樣做都是轉檔需要,利用離峰時間處理的。
刪除