Sql server 如何将IBM DB2服务器添加到SQL server的链接服务器

Sql server 如何将IBM DB2服务器添加到SQL server的链接服务器,sql-server,db2,linked-server,Sql Server,Db2,Linked Server,通过.Net,我可以连接到DB2数据库: 首先,我包括对IBM.Data.DB2.iSeries的引用 然后创建一个新的IBM.Data.DB2.iSeries.iDB2Connection。连接字符串为 DataSource=ChaDb2Server;UserID=MyUsername;Password=MyPassword; 然后创建一个IBM.Data.DB2.iSeries.iDB2Command,依此类推 现在我正试图让我的SQLServer2005直接访问相同的数据。在SQLSer

通过.Net,我可以连接到DB2数据库:

首先,我包括对IBM.Data.DB2.iSeries的引用 然后创建一个新的IBM.Data.DB2.iSeries.iDB2Connection。连接字符串为

DataSource=ChaDb2Server;UserID=MyUsername;Password=MyPassword;
然后创建一个IBM.Data.DB2.iSeries.iDB2Command,依此类推

现在我正试图让我的SQLServer2005直接访问相同的数据。在SQLServerManagementStudio中,我右键单击链接服务器,然后选择新建链接服务器

Linked Server:   ChaDb2Server
Provider:        IBM OLE DB Provider for DB2
Product Name:    ???
Data Source:     ChaDb2Server
Provider String: DataSource=ChaDb2Server;UserID=MyUsername;Password=MyPassword;
Location:        ???
我可以将位置留空,但产品名称不能为空,我不知道在这里填写什么

在Security选项卡上,我选择bemakeusingthisecurity上下文,并重复UserID和密码

已创建链接服务器,但当我尝试展开Catalogs/default/Tables时,会收到一条错误消息:

OLE DB provider 'IBMDADB2.DB2COPY1' reported an error. Authentication failed. (Microsoft SQL Server, Error: 7399)
我不知道IBMDADB2.DB2COPY1这个名字是从哪里来的

此外,当我尝试选择数据时:

Select * from ChaDB2Server.ChaDb2Server.Information_Schema.Tables
我得到了一个类似的错误:

Msg 7399, Level 16, State 1, Line 1
OLE DB provider 'IBMDADB2.DB2COPY1' reported an error. Authentication failed.

显然,我链接服务器的方式中缺少了一些东西。有人知道如何做到这一点吗?

我不知道为什么,但在通过GUI进行设置时,我从未有过让链接服务器正常工作的运气。然而,我用sp_addlinkedserver成功地实现了这一点。请参阅此处,以了解IBM关于如何设置此功能的说明:

我使用IBM提供商时运气不好。我听说这很棘手。但是,我已经成功地将Microsoft OLE DB提供程序用于ODBC驱动程序

我的配置指向DSN,运行良好。我只填写了3个字段,即提供程序Microsoft OLE DB provider for ODBC驱动程序、产品名称value='not used'和SQL server上DSN的数据源名称

如果您不介意使用ODBC提供程序,它将适合您。

我在SQL中将DB2 LUW server设置为链接服务器的方法如下:

1-我在mySQL服务器上安装了相应的DB2 LUW客户端

2-我创建链接服务器如下所示:

replace the <...text...>  with your values

/****** Object:  LinkedServer [<DB2_DB_Name>]    Script Date: 09/08/2014 09:46:02 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'<DB2_DB_Name>', @srvproduct=N'IBMADB2.DB2COPY1', @provider=N'IBMDADB2.DB2COPY1', @provstr=N'Database=<DB2_DB_Name>;Hostname=<DB2 Server running the DB2 database>;Port=5900'
 /* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'<DB2_DB_Name>',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

我不介意使用ODBC提供程序。但到目前为止,我能够连接的唯一方法是使用.NET提供程序。为了使用ODBC连接,是否需要先设置数据源ODBC?我还没想好怎么让它工作,是的。数据源名称是您在“data Sources ODBC”IBM说明中创建的系统dsn的名称。例如,DB2 V9的典型默认安装将生成PROGID IBMDADB2.DB2COPY1。但它没有说明如何确认这是正确的!我怎样才能知道progid是什么?我想它已经在你收到的错误消息中被确认了。这里错的不是ProgID。但一定要用那个。
replace the <...text...>  with your values

/****** Object:  LinkedServer [<DB2_DB_Name>]    Script Date: 09/08/2014 09:46:02 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'<DB2_DB_Name>', @srvproduct=N'IBMADB2.DB2COPY1', @provider=N'IBMDADB2.DB2COPY1', @provstr=N'Database=<DB2_DB_Name>;Hostname=<DB2 Server running the DB2 database>;Port=5900'
 /* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'<DB2_DB_Name>',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'<DB2_DB_Name>', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO