OLE DB 访问接口 "SQLNCLI" 返回了消息 "未指定的错误"。

来源:互联网 发布:刷mac os 编辑:程序博客网 时间:2024/05/18 02:48

这个月总公司收购了一家小公司,这家小公司的数据库用的是32位的 Sql2000 ,已经使用很长一段时间了,系统也比较稳定。本着节约成本的原则,总公司保留原公司的一套管理系统,但要求重要数据每天上传到总公司的64位 Sql2005 数据库中去,这个简单的工作自然是交给我高升这样的小人物去完成了。

原想这是个很简单的差事,可是当我建好 LinkServer 以后却报出了如下错误,从此我的噩梦开始了:

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "Unspecified error".
OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "The stored procedure required to complete this operation could not be found on the server. Please contact your system administrator.".
消息 7311,级别 16,状态 2,第 1 行
Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI" for linked server "TEST_GAO". The provider supports the interface, but returns a failure code when it is used.

error 7311 : 安装在服务 器"TEST_GAO" 的版本需要打升级吗?一查对方的服务器还是 sp3 的版本,于是下载了一个 sp4 的补丁,可是安装以后问题依旧。接着我又用自己的电脑上安装的 Sql2005 和远程的 Sql2000 建立了一个 LinkServer 测试了一下,结果很正常的就连上了,并且可以查询出数据。这个问题可真是奇怪了,难道发生了什么灵异事件?我自己的电脑和两台服务器都是安装的 windows server 2003 sp2 的操作系统,为什么同样是Sql2005我自己的就能连上,而服务器上的却不能连呢?

原来是因为32位的 Sql2000 升级到sp3或者sp4以后还需要手工执行补丁包内的 Instcat.sql 脚本才能连接上64位的 Sql2005 ,执行 cmd 进入命令行模式,输入如下语句,完成安装,这下 LinkServer 能够正常连接。

输入 : osql -U gaosheng -P sheng -S 127.0.0.1 -i C:"sql2ksp4"install"instcat.sql

-U:Sql2000的登陆名,要是具备管理权限的,最好是使用sa用户
-P:密码
-S:服务器名或IP地址
-i:脚本所在的路径及名称,注意大小写。

参考MSDN : http://support.microsoft.com/kb/906954/zh-tw 

 

LinkServer 建好以后下一步就是查数据写数据了,Sql语句写起来是很简单,可是开启事务后又出现问题了:

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "The partner transaction manager has disabled its support for remote/network transactions.".
消息 7391,级别 16,状态 2,第 1 行
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "TEST_GAO" was unable to begin a distributed transaction.

error 7391 : 这很显然由于开启了事 务,需要分布式事务协调器的支持。打开控制面板 - 管理工具 - 服务,将两台服务器上的 Distributed Transaction Coordinator (MSDTC) 服务开启,注意 MSDTC 服务的登陆名必须选择 NETWORK SERVICE 用户。然后设置高级选项,运行 dcomcnfg.exe ,进入组件服务,选择我的电脑右键属性,MSDTC - 安全配置,选:网络DTC访问,允许入站,允许出站,并且不要求进行验证。其他的可以根据需要选择,不是必须选项。

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "No transaction is active.".
消息 7391,级别 16,状态 2,第 1 行
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "TEST_GAO" was unable to begin a distributed transaction.

error 7391 : 怎么还是这个错误,没有活动事务,无法启动分布式事务?高级配置也做过了,并且已经不要求进行验证了,难道这样还是不行?那就麻烦了,两台服务器并不在同一个域中,这样怎么让他相互信任呢,那就需要配置hosts文件了。

C:"WINDOWS"system32"drivers"etc"hosts ,在系统目录下找到这个隐藏的hosts系统文件,在文件的末尾加上对方的IP地址和主机名,如果服务器是集群的还要加上cluster的地址和虚拟IP地址,如:

136.16.25.79    GAOSHENG_Cluster
136.16.25.40    GAOSHENG_V1
136.16.25.80    GAOSHENG_DB1

第一个是Cluster主机的IP和主机名,第二个是虚拟的IP和主机名,第三个才是真实地址,加上前两个地址是为了保证服务器宕机以 后,Cluster做了故障转移LinkServer还能正常使用。如果不是集群服务器只需要第三个真实地址就行了,这样双方就能互相信任,正常使用分布 式事务了。注意这个hosts文件两边都要配置的,配置的是对方的IP地址和文件名。

OLE DB provider "SQLNCLI" for linked server "TEST_GAO" returned message "Cannot start more transactions on this session.".
消息 7395,级别 16,状态 2,第 1 行
Unable to start a nested transaction for OLE DB provider "SQLNCLI" for linked server "TEST_GAO". A nested transaction was required because the XACT_ABORT option was set to OFF.

还来!怎么还是有错误啊?
error 7395 : 还好直接告诉我怎么做了,在 Begin Transaction 前加上 SET XACT_ABORT ON 即可。

现在总算是不抱错了,查询修改也没问题了,问题终于解决了。建一个简单的 LinkServer 居然就出现了这么多的问题,一方面是我学艺不精,另一方面反映出来的是平时都是单服务器的操作,很多问题根本就是遇不到的,光有理论是远远不够的。不过最 后能够解决问题也反映出我解决问题的能力还是有的,搞不懂就问人,搞得懂就答人,没有人懂还可以问神。( MSDN 和 CSDN )

原创粉丝点击