当前位置: 澳门新濠3559 > 数据库 > 正文

创建链接服务器后,这个选项也对应着一个访问

时间:2019-10-29 09:39来源:数据库
在创建SQLServer的链接服务器时,可以看到有如下几种访问接口,其中我们常用的只有1、3、4、6。其中4是安装Oracle客户端才会出现的接口,3、6是由于我电脑上装了2008R2和2012两个版本的

在创建SQL Server的链接服务器时,可以看到有如下几种访问接口,其中我们常用的只有1、3、4、6。其中4是安装Oracle客户端才会出现的接口,3、6是由于我电脑上装了2008R2和2012两个版本的数据库所致。

  长期以来,我一直用的是 MS SQL Server / Access 数据库,通过.NET 访问MS自家的东西几乎没碰到过什么麻烦。最近项目中要用 Oracle 作为数据库,学习研究了一些 .NET 访问Oracle 的东西,发现问题倒真的不少。

创建链接服务器。链接服务器让用户可以对 OLE DB 数据源进行分布式异类查询。在使用 sp_addlinkedserver 创建链接服务器后,可对该服务器运行分布式查询。如果链接服务器定义为 SQL Server 实例,则可执行远程存储过程。

澳门新濠3559 1

1。System.Data.OracleClient 和 System.Data.OleDb 命名空间

澳门新濠3559 2 Transact-SQL 语法约定

3、6可以看做一样的接口,因此我们只讨论1、3、4。此外不要忽略了上边还有个SQL Server的服务器类型,这个选项也对应着一个访问接口。

   虽然通过这两个命名空间的类都可以访问 Oracle 数据库,但和 SQL Server 类似的(System.Data.SqlClient 命名空间的类效率要比 System.Data.OleDb 命名空间中的类高一些),System.Data.OracleClient 命名空间中的类要比 System.Data.OleDb 命名空间的类效率高一些(这一点我没有亲自验证,但大多数地方都会这么说,而且既然专门为 Oracle 作的东西理论上也应该专门作过针对性的优化)。

澳门新濠3559 3  语法

这四个访问接口分别对应:

  当然还有另一点就是从针对性上说,System.Data.OracleClient 要更好一些:

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] 
     [ , [ @provider= ] 'provider_name' ]
     [ , [ @datasrc= ] 'data_source' ] 
     [ , [ @location= ] 'location' ] 
     [ , [ @provstr= ] 'provider_string' ] 
     [ , [ @catalog= ] 'catalog' ] 
  • SQL Server--C:WindowsSystem32sqlsrv32.dll
  • 1--OLEDB提供的对SQL Server的访问接口,OLEDB是一个基于COM 组件服务的data access provider,或者说一个数据访问的API,从脚本来看使用的是SQLNCLI接口,并非sqlncli11,猜测OLEDB可能是存在选择机制的。
  • 3--SQL Server客户端提供的访问接口,C:WindowsSystem32sqlncli11.dll
  • 4--Oracle提供的的访问接口,在创建到Oracle的DBLINK时使用

   比如数据类型,System.Data.OleDb.OleDbType 枚举中所列的就没有 System.Data.OracleClient.OracleType 枚举中的那些有针对性;另外,Oracle 的Number 类型如果数字巨大,超出 .NET 数据类型范围的情况中,就必须使用System.Data.OracleClient 中的专门类 -- OracleNumber 类型。

澳门新濠3559 4  参数

至于OLEDB与ODBC的区别,我认为stackoverflow上一篇讨论文章很好的解释了两者的差别,鉴于各种论点不是很统一因此贴出链接:

  好了,不再赘述这两个的比较,下面主要讨论System.Data.OracleClient 命名空间中的类型,即 ADO.NET for Oracle Data Provider (数据提供程序)。

[ @server = ] '*server*'
要创建的链接服务器的名称。server 的数据类型为 sysname,没有默认值。

what is the difference between OLE DB and ODBC data sources?

2。数据库连接:

   无论是 System.Data.OleDb 还是 System.Data.OracleClient 访问 Oracle 都需要在 .NET 运行的机器(ASP.NET 中就是 Web 服务器)安装 Oracle 客户端组件。(这一点是和 MS 的两种数据库不同的,MS 的东西安装 MDAC: Microsoft Data Access Component 2.6 以上版本后,就无须再安装 SQL Server 客户端或者 Office 软件,就能访问。)

[ @srvproduct = ] '*product_name*'
要添加为链接服务器的 OLE DB 数据源的产品名称。product_name 的数据类型为 nvarchar(128),默认值为 NULL。如果为 SQL Server,则不必指定 provider_namedata_sourcelocationprovider_stringcatalog

System Requirements:

  (1) 如用 System.Data.OracleClient 访问 Oracle,客户端组件版本应在 Oracle 8i Client Release 3 (8.1.7)以上版本。MS 只确保访问 Oracle 8.1.6、Oracle 8.1.7、Oracle 9i 服务器时的情况。MDAC 2.6 以上。

[ @provider = ] '*provider_name*'
与此数据源对应的 OLE DB 访问接口的唯一编程标识符 (PROGID)。对于当前计算机中安装的指定 OLE DB 访问接口,provider_name 必须唯一。provider_name 的数据类型为 nvarchar(128),默认值为 NULL;但如果忽略 provider_name,则使用 SQLNCLI。(使用 SQLNCLI 并且 SQL Server 将重定向到 SQL Server Native Client OLE DB 访问接口的最新版本。)OLE DB 访问接口应以指定的 PROGID 在注册表中注册。

  (2)如用 System.Data.OleDb 访问 Oracle,客户端组件版本 7.3.3.4.0 以上或 8.1.7.4.1 以上。MDAC 2.6 以上。

  如服务器为 Oracle8i 以上,客户端组件版本应为 8.0.4.1.1c。

[ @datasrc = ] '*data_source*'
由 OLE DB 访问接口解释的数据源的名称。data_source 的数据类型为 nvarchar(4000)data_source 作为 DBPROP_INIT_DATASOURCE 属性传递以初始化 OLE DB 访问接口。

  在 .NET 运行的机器中,安装 Oracle 客户端,然后打开 Net Manager (Oracle 9i) / Easy Config (Oracle 8i) 按你以前的经验设置本地服务的映射(这里的服务名将用于数据库连接串)。

  System.Data.OracleClient 中访问 Oracle 数据库的连接串是:

[ @location = ] '*location*'
由 OLE DB 访问接口解释的数据库的位置。location 的数据类型为 nvarchar(4000),默认值为 NULL。location 作为 DBPROP_INIT_LOCATION 属性传递以初始化 OLE DB 访问接口。

User ID=用户名; Password=密码; Data Source=服务名

  (上述为一般的连接串,详细的连接串项目可以在 System.Data.OracleClient.OracleConnection.ConnectionString 属性的文档中找到。)

[ @provstr = ] '*provider_string*'
OLE DB 访问接口特定的连接字符串,它可标识唯一的数据源。provider_string 的数据类型为 nvarchar(4000),默认值为 NULL。provstr 或传递给 IDataInitialize 或设置为 DBPROP_INIT_PROVIDERSTRING 属性以初始化 OLE DB 访问接口。

  System.Data.OleDb 中的访问 Oracle 数据库的连接串是:

当针对 SQL Server Native Client OLE DB 访问接口创建链接服务器时,可以使用 SERVER 关键字来指定实例,即使用 SERVER=servernameinstancename 指定特定 SQL Server 实例。servername 是运行 SQL Server 的计算机的名称,instancename 是用户要连接的特定 SQL Server 实例的名称。

Provider=MSDAORA.1; User ID=用户名; Password=密码; Data Source=服务名

注意:
若要访问镜像数据库,则连接字符串必须包含数据库名称。该名称是数据访问接口启用故障转移尝试所必需的。可以在 @provstr@catalog 参数中指定数据库。此外,连接字符串还可以提供故障转移伙伴名称。有关详细信息,请参阅建立到数据库镜像会话的初始连接

 

 

[ @catalog = ] '*catalog*'
与 OLE DB 访问接口建立连接时所使用的目录。catalog 的数据类型为 sysname,默认值为 NULL。catalog 作为 DBPROP_INIT_CATALOG 属性传递以初始化 OLE DB 访问接口。在针对 SQL Server 实例定义链接服务器时,目录指向链接服务器映射到的默认数据库。

 

澳门新濠3559 5  返回代码值

   关于访问方式的总结

0(成功)或 1(失败)

我在查看ORACLE网站、MSDN2005及注册表之后,小有收获,特写此文,希望对各位有所帮助。

澳门新濠3559 6  结果集

好了,废话结束,现在看正文:

无。

1.ODBC方式
我们可以在 "我的电脑-> 控制面板-> (性能和维护-> )管理工具-> 数据源(ODBC)-> 系统DSN-> 添加 ",查看系统中已经安装好的ODBC驱动,其中就包含了“Microsoft   ODBC   Driver   for   Oracle”。

澳门新濠3559 7  注释

所以,如果用ODBC方式来访问ORACLE,可以不用安装ORACLE   CLIENT;

下表显示为能通过 OLE DB 访问数据源而建立链接服务器的方法。对于特定的数据源,可以使用多种方法为其设置链接服务器;该表中可能有多行适用于一种数据源类型。该表还显示了用于设置链接服务器的 sp_addlinkedserver 参数值。

2.OLEDB方式

远程 OLE DB 数据源 OLE DB 访问接口 product_name provider_name data_source location provider_string catalog

SQL Server

Microsoft SQL Server Native Client OLE DB 访问接口

SQL Server 1(默认值)

 

 

 

 

 

SQL Server

Microsoft SQL Server Native Client OLE DB 访问接口

 

SQLNCLI

SQL Server 的网络名称(用于默认实例)

 

 

数据库名称(可选)

SQL Server

Microsoft SQL Server Native Client OLE DB 访问接口

 

SQLNCLI

servernameinstancename(用于特定实例)

 

 

数据库名称(可选)

Oracle

Microsoft OLE DB Provider for Oracle

任何2

MSDAORA

用于 Oracle 数据库的 SQL*Net 别名

 

 

 

Oracle,版本 8 及更高版本

Oracle Provider for OLE DB

任何

OraOLEDB.Oracle

用于 Oracle 数据库的别名

 

 

 

Access/Jet

Microsoft OLE DB Provider for Jet

任何

Microsoft.Jet.OLEDB.4.0

Jet 数据库文件的完整路径

 

 

 

ODBC 数据源

Microsoft OLE DB Provider for ODBC

任何

MSDASQL

ODBC 数据源的系统 DSN

 

 

 

ODBC 数据源

Microsoft OLE DB Provider for ODBC

任何

MSDASQL

 

 

ODBC 连接字符串

 

文件系统

Microsoft OLE DB Provider for Indexing Service

任何

MSIDXS

索引服务目录名称

 

 

 

Microsoft Excel 电子表格

Microsoft OLE DB Provider for Jet

任何

Microsoft.Jet.OLEDB.4.0

Excel 文件的完整路径

 

Excel 5.0

 

IBM DB2 数据库

Microsoft OLE DB Provider for DB2

任何

DB2OLEDB

 

 

请参阅 Microsoft OLE DB Provider for DB2 文档。

DB2 数据库的目录名称

请大家打开注册表编辑器regedit,搜索oracle即可以搜索到以下键:
Microsoft   OLE   DB   Provider   for   Oracle

1 这种设置链接服务器的方式强制链接服务器的名称与 SQL Server 远程实例的网络名称相同。使用 data_澳门新濠3559,source 指定服务器。

HKEY_CLASSES_ROOTCLSID{e8cc4cbe-fdff-11d0-b865-00a0c9081c1d}OLE   DB   Provider
HKEY_CLASSES_ROOTMSDAORA

2“任何”指产品名称可以任意。

所以,只要你安装了合适版本的MDAC,那么起码就已经可以使用OLEDB来访问ORACLE了。

如 果未指定访问接口名称或将 SQL Server 指定为产品名称,则 Microsoft SQL Server Native Client OLE DB 访问接口将是用于 SQL Server 的访问接口。即使指定了较早版本的访问接口名称 SQLOLEDB,在保存到目录时该名称也将改为 SQLNCLI。

3.System.Data.OracleClient方式

data_sourcelocationprovider_stringcatalog 参数标识链接服务器所指向的一个或多个数据库。如果其中任一参数为 NULL,则不设置相应的 OLE DB 初始化属性。

以上2种都是比较通用的方式,我们再来看看M$专门为ORACLE写的类。
请大家打开MSDN2005,输入地址

在群集环境中,当指定指向 OLE DB 数据源的文件名时,应使用通用命名规则 (UNC) 名称或共享驱动器指定位置。

ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs /WD_ADONET/html/054f76b9-1737-43f0-8160-84a00a387217.htm(您也可以通过目录、索引或者搜索 来找到)
《Oracle   .NET   Framework   数据提供程序的系统要求》(即System.Data.OracleClient命名空间中的类),摘要如下:

不能在用户定义的事务内执行 sp_addlinkedserver

Oracle   .NET   Framework   数据提供程序需要   Microsoft   数据访问组件   (MDAC)   2.6   版或更高版本。建议使用   MDAC   2.8   SP1。
还必须安装   Oracle   8i   Release   3   (8.1.7)   客户端或更高版本。
Oracle   9i   版本之前的   Oracle   客户端软件无法访问   UTF16   数据库,因为   UTF16   是   Oracle   9i   中的一项新功能。要使用此功能,必须将客户端软件升级到   Oracle   9i   或更高版本。

安全说明:
如果使用 sp_addlinkedserver 创建链接服务器,则将为所有本地登录添加默认自映射。对于非 SQL Server 访问接口,通过 SQL Server 验证的登录名也许能够以 SQL Server 服务帐户身份访问该访问接口。管理员应考虑使用 sp_droplinkedsrvlogin <linkedserver_name>, NULL 删除全局映射。

哈哈,M$其实没有我们想象中的勤奋,他只是帮ORACLE   CLIENT做了个包装而已。

澳门新濠3559 8  权限

4.Oracle   Data   Provider   for   .net(ODP.NET)

要求具有 ALTER ANY LINKED SERVER 权限。

我们再到ORACLE的老家转转,可以发现他在很多地方都吹嘘ODP.NET,看看它有些什么要求才能用吧。

澳门新濠3559 9  示例

请大家在浏览器中输入地址(ORACLE的网站有点慢,请不要急)

A. 使用 Microsoft SQL Server Native Client OLE DB 访问接口

下面的示例将创建一个名为 SEATTLESales 的链接服务器。产品名称为 SQL Server,未使用访问接口名称。

USE master;
GO
EXEC sp_addlinkedserver 
   'SEATTLESales',
   N'SQL Server'
GO

下例使用 SQL Server Native Client OLE DB 访问接口在 SQL Server 实例中创建链接服务器 S1_instance1

EXEC sp_addlinkedserver   
   @server='S1_instance1', 
   @srvproduct='',
   @provider='SQLNCLI', 
   @datasrc='S1instance1'

B. 使用 Microsoft OLE DB Provider for Microsoft Access

Microsoft.Jet.OLEDB.4.0 访问接口连接到使用 2002-2003 格式的 Microsoft Access 数据库。下面的示例将创建一个名为 SEATTLE Mktg 的链接服务器。

注意:
该示例假设已安装 Microsoft Access 和 Northwind 示例数据库,并且 Northwind 数据库位于 C:MsofficeAccessSamples 中。
EXEC sp_addlinkedserver 
   @server = 'SEATTLE Mktg', 
   @provider = 'Microsoft.Jet.OLEDB.4.0', 
   @srvproduct = 'OLE DB Provider for Jet',
   @datasrc = 'C:MSOfficeAccessSamplesNorthwind.mdb'
GO

Microsoft.ACE.OLEDB.12.0 访问接口连接到使用 2007 格式的 Microsoft Access 数据库。下面的示例将创建一个名为 SEATTLE Mktg 的链接服务器。

注意:
该示例假设已安装 Microsoft Access 和 Northwind 示例数据库,并且 Northwind 数据库位于 C:MsofficeAccessSamples 中。
EXEC sp_addlinkedserver 
   @server = 'SEATTLE Mktg', 
   @provider = Microsoft.ACE.OLEDB.12.0', 
   @srvproduct = 'OLE DB Provider for ACE',
   @datasrc = 'C:MSOfficeAccessSamplesNorthwind.accdb'
GO

Q:   What   do   I   need   to   have   installed   on   my   client   machine   to   have   ODP.NET   work?

使用 Microsoft OLE DB Provider for Oracle

下例创建一个名为 LONDON Mktg 的链接服务器,它使用 Microsoft OLE DB Provider for Oracle 并假定 Oracle 数据库的 SQL*Net 别名为 MyServer

EXEC sp_addlinkedserver
   @server = 'LONDON Mktg',
   @srvproduct = 'Oracle',
   @provider = 'MSDAORA',
   @datasrc = 'MyServer'
GO

A:   You   will   require   the   following:  
Windows   2000,   Windows   XP   Professional,   or   Windows   Server   2003  
Microsoft   .NET   Framework   1.0   or   higher  
Oracle9i   Client   Release   2   (9.2)   or   higher  
Oracle   Net   Services   (included   with   the   client)  
Oracle   Services   for   Microsoft   Transaction   Server,   Release   2   (9.2)   or   higher.   This   is   required   for   applications   using   distributed   transacations.  

D. 将 Microsoft OLE DB Provider for ODBC 与 data_source 参数一起使用

下例创建一个名为 SEATTLE Payroll 的链接服务器,它使用 Microsoft OLE DB Provider for ODBC (MSDASQL) 以及 data_source 参数。

注意:
在使用该链接服务器之前,必须在该服务器中将指定的 ODBC 数据源名称定义为系统 DSN。
EXEC sp_addlinkedserver 
   @server = 'SEATTLE Payroll', 
   @srvproduct = '',
   @provider = 'MSDASQL', 
   @datasrc = 'LocalServer'
GO

简单翻译:

E. 将 Microsoft OLE DB Provider 用于 Excel 电子表格

若 要创建使用 Microsoft OLE DB Provider for Jet 访问 1997 - 2003 格式的 Excel 电子表格的链接服务器定义,请首先通过指定要在 Excel 工作表中选择的行和列在 Excel 中创建一个命名范围。这样,可以在分布式查询中将此范围的名称引用为表名称。

EXEC sp_addlinkedserver 'ExcelSource',
   'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   'c:MyDataDistExcl.xls',
   NULL,
   'Excel 5.0'
GO

若要访问 Excel 电子表格中的数据,请将单元范围与名称相关联。以下查询通过使用先前设置的链接服务器,将指定的命名范围 SalesData 作为表来访问。

SELECT *
   FROM ExcelSource...SalesData
GO

如果 SQL Server 在可以访问远程共享的域帐户下运行,则可以使用 UNC 路径来代替映射驱动器。

EXEC sp_addlinkedserver 'ExcelShare',
   'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   '\MyServerMyShareSpreadsheetsDistExcl.xls',
   NULL,
   'Excel 5.0'

若要连接到 Excel 2007 格式的 Excel 电子表格,请使用 ACE 访问接口。

EXEC sp_addlinkedserver @server = N'ExcelDataSource', 
@srvproduct=N'ExcelData', @provider=N'Microsoft.ACE.OLEDB.12.0', 
@datasrc=N'C:DataFolderPeople.xlsx',
@provstr='EXCEL 12.0' ;

如果你用ODP.NET来访问ORACLE数据库,你需要以下条件:
操作系统:WIN2K   XP   2003
.NET   FRAMEWORK   1.0以上
ORACLE9I以上的客户端

H. 使用 Microsoft OLE DB Provider for Jet 访问文本文件

以下示例创建直接访问文本文件的链接服务器,而没有将这些文件链接为 Access .mdb 文件中的表。访问接口为 Microsoft.Jet.OLEDB.4.0,访问接口字符串为 Text

数据源是包含文本文件的目录的完整路径。schema.ini 文件(描述文本文件的结构)必须与此文本文件存在于相同的目录中。有关如何创建 Schema.ini 文件的详细信息,请参阅 Jet 数据库引擎文档。

--Create a linked server.
EXEC sp_addlinkedserver txtsrv, 'Jet 4.0', 
   'Microsoft.Jet.OLEDB.4.0',
   'c:datadistqry',
   NULL,
   'Text'
GO

--Set up login mappings.
EXEC sp_addlinkedsrvlogin txtsrv, FALSE, Admin, NULL
GO

--List the tables in the linked server.
EXEC sp_tables_ex txtsrv
GO

--Query one of the tables: file1#txt
--using a four-part name. 
SELECT * 
FROM txtsrv...[file1#txt]

5.第3方的观点:
在    

I. 使用 Microsoft OLE DB Provider for DB2

以下示例创建名为 DB2 的链接服务器,该服务器使用 Microsoft OLE DB Provider for DB2

EXEC sp_addlinkedserver
   @server='DB2',
   @srvproduct='Microsoft OLE DB Provider for DB2',
   @catalog='DB2',
   @provider='DB2OLEDB',
   @provstr='Initial Catalog=PUBS;
       Data Source=DB2;
       HostCCSID=1252;
       Network Address=XYZ;
       Network Port=50000;
       Package Collection=admin;
       Default Schema=admin;'

澳门新濠3559 10  请参阅

有一篇文章叫 < <Take   Advantage   of   Oracle   in   .NET> >

参考

分布式查询存储过程 (Transact-SQL)
sp_addlinkedsrvlogin (Transact-SQL)
sp_addserver (Transact-SQL)
sp_dropserver (Transact-SQL)
sp_serveroption (Transact-SQL)
sp_setnetname (Transact-SQL)
系统存储过程 (Transact-SQL)
系统表 (Transact-SQL)

讲了如何在可视环境下(也就是用鼠标点、拖等操作)访问ORACLE   。
用的似乎就是OLE   DB的方式。

其他资源

为委托配置链接服务器
与 SQL Server 一起测试过的 OLE DB 访问接口

好了,现在来做个总结。

同志们,回顾历史,展望未来,我们要发扬XXXX,高举YYYY(以下省略5000字)......

1.在不安装ORACLE客户端的情况下,可以用ODBC和OLEDB   2种方式来访问ORACLE;

2.如果喜欢多往别人的机器装东西,不怕麻烦,可以用“性能最好”(ORACLE网站这么说的)的ODP.NET来访问ORACLE;

3.如果用System.Data.OracleClient,可以稍微少装点东西,不过比2的帮助文档更多,并且我们似乎都习惯使用微软的东西。

4.推荐使用System.Data.OleDb中的类来访问ORACLE,优点:(1)因为我懒,我不喜欢往别人和我自己的机器里安装过多的东西; (2)可以运行在WIN98以上的系统下,而2   3中的方式只能在WIN2K以上的系统下;(3)ODBC似乎太老了点,看来我是中庸派的人......(哎,老了   -_-     )

好了,感谢您坚持看完本文,希望没有浪费您的时间,对您有所帮助。

编辑:数据库 本文来源:创建链接服务器后,这个选项也对应着一个访问

关键词: 澳门新濠3559