Sqlserver连接oracle进行读写数据库、SQL Server 2008创建oracle链接服务器(心得)

项目中用到sqlserver去连接oracle,通过sqlserver可以直接操作oracle.

1、安装oracle客户端软件,并配置:
  www.2cto.com  


1)打开Net Manager,新增服务名: www.2cto.com  
 

2)选择网络协议:
 

3)填写主机名和端口号:
  www.2cto.com  

4)填写服务名:
 


5)下一步,进行测试:
 

6)测试结果:
 

2、设置sqlserver:
1)打开企业管理器,选择服务器对象--链接服务器
 

2)右键选择"新建链接服务器"
 

3)常规选项,填写内容。
链接服务器:定义链接名称;
服务器类型--其他数据源,指定程序名称为:Microsoft OLE DB Provider for Oracle; 
  www.2cto.com  
产品名称:Oracle(可不填);
数据源:orcl(oracle新建的服务名);
访问接口字符串:UID=username;PWD=userpasswd(或MSDAORA);
 

4)选择安全性:
选择使用此安全上下文进行连接,输入用户名,密码。
 

5)连接中可看到表和视图:
 

整个过程基本完成!

3、SQL的写法有两种:
a) 使用T-SQL语法:

SELECT * FROM ERP.BAS_ITEM_CLASS

注意在,SQL查询分析器中输入SQL语句时注意中文的全角半角切换方式!

b) 使用PLSQL语法: www.2cto.com  
SELECT * FROM OPENQUERY(orcl,'SELECT * FROM ERP.BAS_ITEM_CLASS ')

c)第二种访问方式比第一种约快50%;第二种访问方式跟直连ORACLE的速度相当;第一种访问方式可能会导致一些意外错误,如:
该表不存在,或者当前用户没有访问该表的权限等等一些信息。

d)如果需要访问的column中使用没有精度的数据类型,这两种查询方式都可能会报错,这是ORACLE的BUG,无法修正,只能通过查询语句的特殊处理规避这一问题:
OLE DB 提供程序 'OraOLEDB.Oracle' 为列提供的元数据不一致。执行时更改了元数据信息。

操作系统是32位的情况下,曾经没费太多时间创建好了到oracle的链接服务器。主要要点就是:

1、安装oracle精简客户端。当时我用的是版本比较低的“oracle9i310-客户端简化版”,安装好了以后再配置对应目录(我的是C:\Oracle\ora90\network\ADMIN)下的tnsnames.ora文件。这一步做完,基本上剩余的工作就是在sql server 2008里面创建链接服务器了。

2、新建链接服务器。当时我连的oracle数据库是64位11g,虽然安装的是“oracle9i310-客户端简化版”,最终还是成功创建好了链接服务器。“服务器类型”选的是“其他数据源”,访问接口选“Microsoft OLE DB Provider for Oracle”,"产品名称“随便输了点字符,没什么影响;”数据源“就是使用tnsnames.ora里面自己设置好的名称,比如,我在里面设的名称是"JSB",就照搬过来填在此处。“访问接口字符串”这个地方是耽误了我一段时间的,最开始我把这里空着,链接服务器当时也是创建成功了的,但是实际执行最简单的查询都始终处于执行中,没见着报错也没见到出结果。后来是把连接字符串写在这里才最终正常返回结果的!这个位置我是这样设的:data source=JSB;user=jsb123;password=jsb123;Persist Security Info=True。oracle用户名和密码是根据自己的实际情况来设。

     这一步骤还没完,还要把选择页切换到“安全性”,选中“使用此安全上下文建立连接(M):",然后输入oracle用户名和密码。最后点【确定】按钮,至此,到oracle的链接服务器创建成功!顺便补充一句,访问接口选“Oracle Provider for OLE DB”,我始终没有创建成功过,先记录下来,如有时间再琢磨了。完整截图如下:

------------------------------------------------偶是分割线-----------------------------------------------------------------------------------------------

    转眼间,遇到了64位的操作系统和64位的sql server 2008,要链接的仍然是同一个64位11goracle数据库。本以为跟以前的差不多,但是访问接口下拉选项根本就没有“Microsoft OLE DB Provider for Oracle”,所以32位下的成功经验完全用不上了。用百度搜索后决定用odbc方式,于是先后碰到如下问题:

    问题一,打开odbc源配置界面,系统DSN找不到oracle的驱动。后来才搞清楚如果是64位的odbc驱动就用”C:\Windows\System32\odbcad32.exe",如果是32的odbc驱动那就到“C:\Windows\SysWOW64\odbcad32.exe”设置。不晓得我说反没有,按我的印象是这样子的

    问题二,终于找到了“oracle9i310-客户端简化版”所安装的odbc驱动,第二个问题随之而来,创建系统DSN在测试连接始终失败。从网上查到的信息是说是这种低版本的连接11g数据库有问题。最终放弃了这个客户端版本另找他法。其实,32位下工作得很好,最终还是没落实清楚到底有没有冤枉它。

    问题三,找合适的64位客户端和odbc驱动。很奇怪“oracle9i310-客户端简化版”做得很好,安装后想要的东西都有了,现在为了解决问题三下载了多个压缩包都没使用成功,这个问题耗费了快两天的业余时间,比如下载的“ODAC1120320X64copy.zip",有人说好用,我是一点没用上,放弃。最后起作用的是这两个压缩包:”instantclient-basic-windows.x64-11.2.0.3.0.zip“和”instantclient-odbc-windows.x64-11.2.0.3.0.zip“。推荐自己在甲骨文网站注册帐号后自行下载。好,第三个问题ok。装完整的oracle客户端甚至完整安装oracle数据库也许就不能纠结这么长时间找软件了。但是,仅仅是为了在sql server 2008数据库服务器上创建oracle链接服务器就这样做,必定不能作为很好的方案。这也是花时间找精简版本的重要原因。

    问题四,驱动有了,接下来添加系统DSN就碰到问题,在TNS Service Name下拉框无选项。这当然跟tnsnames.ora有关,这才发现前一个步骤根本就没有涉及处理tnsnames.ora。后来是拷贝了“oracle9i310-客户端简化版”使用的tnsnames.ora到:”instantclient-basic-windows.x64-11.2.0.3.0“的安装目录,环境变量里面增加”TNS_ADMIN“,值设为:”instantclient-basic-windows.x64-11.2.0.3.0“的安装目录(我设的是:E:\instantclient_11_2)。下拉选项终于能看到tnsnames.ora里面自己设置好的名称了!测试连接成功,胜利近在眼前哈哈!相关的截图如下(Data Source Name由自己来设,我设的是oracle111。建链接服务器要用到这个名称):

    问题五,链接服务器始终创建不成功,报错:链接服务器 的 OLE DB 访问接口 "MSDASQL" 报错。身份验证失败;ORA-12154: TNS: 无法解析指定的连接标识符;Microsoft SQL Server,错误: 7399。几乎又用了一晚上在搜索该问题的解决方法。最后的正确答案是从csdn的旧帖子找到的,原讨论帖地址:http://bbs.csdn.net/topics/70308769 。失败之处就是“访问接口字符串(V)”没有设:MSDASQL!设好以后一切ok。完整的截图如下:

 

    64位环境下的链接服务器终于配置好了,能正常的查询数据。解决总共花费了两天的业余时间。简单的总结如下,如果知识面广恐怕不用频繁的百度和测试,因此耗费大量时间,例如@provider='MSDASQL',对此一点概念都没有,能百度出来真是有运气的成分!毕竟花时间最后还是解决了,也留了疑问并没有完全了解透彻,还是自我鼓励一下。

因为该服务器作为数据服务器,已经创建SSIS工程,其中部分DTS数据源为ORACLE ,因此已经安装ORACLE驱动。

但是在SQLSERVER中创建链接对象,提示:"ORA-12154: TNS: 无法解析指定的连接标识符"。

解决办法:需要安装64位oracle驱动,(启动sqlplus,查看任务管理器,看到sqlplus*32进程,即可分辨该服务器只安装了32位oracle驱动)

小结:sqlserver SSIS (DTS)需用32位oracle驱动,而链接服务器需要使用64位。安装时需要区别路径,并加入环境变量path,如果是驱动是安装版则不需要改环境变量,如果是绿色版则需要手动添加。另外启动oracle 配置工具需要辨别是哪个版本的配置工具,也可以直接去相应路径修改TNS文件。
 

猜你喜欢

转载自blog.csdn.net/tmjianjun/article/details/90205690