sql server数据库如何建立数据链接到ORACLE数据库,并通过链接查询ORACLE中的表。?

来源:http://topic.csdn.net/t/20050602/13/4053886.html#

SQL Server到Oracle连接服务器的实现

作者:中国论坛网收集 来源:http://www.51one.net 加入时间:2004-8-25

SQL Server到Oracle连接服务器的实现

作者:Jennifer

本文以SQL Server 2k为例说明SQL Server到Oracle连接服务器的具体实现过程。

1.要求pc机上安装oralce客户端软件和sqlserver2000软件。

2.客户端的配置tnsnames.ora文件,配置所要连接的数据库服务器(windows,unix等平台均可以)

eg:tnsnames.ora

......

TEST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.11.90)(PORT = 1521))

)

(CONNECT_DATA =

(sid = blue)

(SERVER = DEDICATED)

)

)

......

3.配置windows的ODBC数据源:

开始菜单—》设置—》管理工具—》数据源(ODBC)—》进入配置用户DSN或者系统DSN均可以:添加—》选择Microsoft ODBC for oracle—

》自定义数据源名称(最好跟tns中连接串同名!)—》服务器名称(必填!填写tns文件中的连接串名称)—》完成。

4.配置sqlserver2000中的连接服务器:

企业管理器—》安全性—》连接服务器—》右键新建连接服务器—》定义连接名称; 选其他数据源; 指定程序名称为:Microsoft OLE DB

Provider for Oracle; 产品名称可不填; 数据源指定刚才ODBC中定义好的数据源名称; 提供程序字符串按以下格式填写:User

ID=username;Password=userpasswd(或者按如下格式:UID=username;PWD=userpasswd),这里的用户名和密码对应所要连接的oracle数据库中

的用户名和密码 —》 安全性标签页里:设置用此安全上下文进行,并录入oracle的数据库用户名和密码—》服务器选项标签页可默认—》确

定。

5.准备工作全部完成啦!在sqlserver企业管理器—》安全性—》连接服务器打开刚建好的连接服务器—》点击表,即可在右边窗口看到该orac

le数据库用户拥有的的所有表名,但在这里还并不能查看表的记录,这个需要在sqserver的查询分析器中用具体sql实现!访问表时,使用格式

为: [连接服务器名]..[ORACLE用户].[表名]。更详细具体的使用这里不再赘述。


创建链接服务器以访问 Oracle 数据库实例

确保运行 SQL Server 的服务器上的 Oracle 客户端软件已达到提供程序所要求的级别。用于 Oracle 的 Microsoft OLE DB 提供程序要求 Oracle 客户端软件支持文件的版本为 7.3.3.4.0 或更高版本,并且 SQL*Net 的版本为 2.3.3.0.4。

在运行 SQL Server 的服务器上创建指向 Oracle 数据库实例的 SQL*Net 别名。有关更多信息,请参见 Oracle 文档。

执行 sp_addlinkedserver 创建链接服务器,指定 MSDAORA 为 provider_name,指定用于 Oracle 数据库实例的 SQL*Net 别名为 data_ source。

以下示例假设已将一个 SQL*Net 别名定义为 OracleDB。

sp_addlinkedserver 'OrclDB ', 'Oracle ', 'MSDAORA ', 'OracleDB '

使用 sp_addlinkedsrvlogin 创建从 SQL Server 登录到 Oracle 登录的登录映射。

以下示例通过 Oracle 登录名 OrclUsr 和密码 OrclPwd 将 SQL Server 登录 Joe 映射到步骤 3 中定义的链接服务器:

sp_addlinkedsrvlogin 'OrclDB ', false, 'Joe ', 'OrclUsr ', 'OrclPwd '


每个 Oracle 数据库实例仅有一个名称为空的目录。Oracle 链接服务器中的表必须使用四部分名称格式 OracleLinkedServerName..OwnerUserName.TableName 进行引用。例如,以下 SELECT 语句引用 Oracle 用户 MARY 在 OrclDB 链接服务器映射的服务器上所拥有的表 SALES。

SELECT * FROM OrclDB..MARY.SALES

在 Oracle 链接服务器中引用表时,请使用以下规则:

如果在 Oracle 中创建的表名和列名没有引用的标识符,请全部使用大写字母名称。

如果在 Oracle 中创建的表名和列名有引用的标识符,请全部使用与 Oracle 中创建名称时相同的字母大小写格式。

INSERT 语句应为表中的所有列提供值,即使表中的某些列为 NULL 或有默认值。


这个我的一个连接Oracle的语句

exec sp_addlinkedserver 'srv_lnk ', ' ', 'MSDAORA ', '远程服务器名或ip地址 '

go

exec sp_addlinkedsrvlogin 'srv_lnk ', 'false ',null, 'oarcle用户名 ', '密码 '

go

select * from openquery(srv_lnk, 'select * from sys.tt ') --sys.tt为sys用户下的表tt

go

--不用时,删除链接服务器

exec sp_dropserver 'srv_lnk ', 'droplogins '


按照各位大侠的指引,我测试了一下,发现取数据时报一下错误,各位大侠能否解答?

OLE DB 提供程序 'MSDAORA ' 报错。

[OLE/DB provider returned message: 发生了一个 Oracle 错误,但无法从 Oracle 中检索错误信息。]

OLE DB 错误跟踪[OLE/DB Provider 'MSDAORA ' IDBInitialize::Initialize returned 0x80004005: ]。


解决方案

若要解决此问题,则请在使用 LIKE 语句比较 Oracle 数据库中固定长度字段中的值时,每次都使用百分号 (%) 通配符。例如: cmd.Parameters.Add( "@p1 ", OleDbType.Char, 3).Value = "a% "

返回页首

更多信息

再现现象的步骤

1. 在 Oracle 中,创建一个名为 TestTable 的表,如下所示: Create Table TestTable (c1 char(3));

2. 将值 "a "插入表中,如下所示: Insert into TestTable c1 values( 'a ');

3. 打开 Microsoft Visual Studio .NET。

4. 在 Visual Basic .NET 中新建一个 Windows 应用程序项目。

5. 确保您的项目包含一个对 System.Data 名称空间的引用,如果未包含,请添加一个对此名称空间的引用。

6. 将一个 Command 按钮放在 Form1 上,将其 Name 属性更改为 btnTest。

7. 对 System 和 System.Data 名称空间使用 Imports 语句,这样,在后面的代码中就不需要在这些名称空间中限定声明了。 Imports System

Imports System.Data

Imports System.Data.OleDb

8. 复制以下代码并将其粘贴到代码窗口中 "Windows 窗体设计器生成的代码 "区域之后的位置: Private Sub btnTest_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles btnTest.Click

Dim sConnectionString As String _

= "Provider=MSDAORA.1;User _

"Data Source=myOracleServer;Persist Security Info=False "

Dim mySelectQuery As String _

= "SELECT * FROM TestTable where c1 LIKE ? "

Dim myConnection As New OleDbConnection(sConnectionString)

Dim myCommand As New OleDbCommand(mySelectQuery, myConnection)

'To resolve this problem, change the parameter

'in the next line to use "% " wildcard character.

myCommand.Parameters.Add( "@p1 ", OleDbType.Char, 3).Value = "a "

myConnection.Open()

Dim myReader As OleDbDataReader = myCommand.ExecuteReader()

Dim RecordCount as Integer

Try

While myReader.Read()

RecordCount = RecordCount + 1

MessageBox.Show(myReader.GetString(0).ToString())

End While

If RecordCount = 0 then

MessageBox.Show( "No data returned ")

Else

MessageBox.Show( "Number of records returned: " & RecordCount)

End If

Catch ex As Exception

MessageBox.Show(ex.ToString())

Finally

' Always call Close when done reading.

myReader.Close()

myConnection.Close()

End Try

End Sub

9. 保存项目。

10. 从调试菜单上,单击启动以运行您的项目。

11. 单击该按钮。注意此时未返回任何数据。

12. 更改参数以使用 "% "通配符,如下所示: myCommand.Parameters.Add( "@p1 ", OleDbType.Char, 3).Value = "a% "

13. 再次运行该项目。注意此时成功返回了数据。


我是在SQL SERVER 查询分析器里执行的,并且没有加任何查询条件啊。

还有几点不明白的地方:

1 .确保运行 SQL Server 的服务器上的 Oracle 客户端软件已达到提供程序所要求的级别。用于 Oracle 的 Microsoft OLE DB 提供程序要求 Oracle 客户端软件支持文件的版本为 7.3.3.4.0 或更高版本,并且 SQL*Net 的版本为 2.3.3.0.4。

如何知道是否满足以上要求

2.使用 sp_addlinkedsrvlogin 创建从 SQL Server 登录到 Oracle 登录的登录映射。

以下示例通过 Oracle 登录名 OrclUsr 和密码 OrclPwd 将 SQL Server 登录 Joe 映射到步骤 3 中定义的链接服务器:

sp_addlinkedsrvlogin 'OrclDB ', false, 'Joe ', 'OrclUsr ', 'OrclPwd '

SQL Server 登录 Joe ???

SELECT *

FROM OrclDB..MARY.SALES

如上在SQL SERVER 查询分析器里执行,就报错。

请谢谢。