1

我正在展示一个通过 Internet 在两个系统之间使用“链接服务器”进行数据事务的存储过程示例

Alter Proc [dbo].[usp_Select_TransferingDatasFromServerCheckingforExample]

@RserverName varchar(100), ----- Server Name  
@RUserid Varchar(100),           ----- server user id
@RPass Varchar(100),              ----- Server Password 
@DbName varchar(100)           ----- Server database    

As
Set nocount on
Set Xact_abort on
Declare @user varchar(100)
Declare @userID varchar(100)
Declare @Db Varchar(100)
Declare @Lserver varchar(100)
Select @Lserver = @@servername
Select @userID = suser_name()
select @User=user
Exec('if exists(Select 1 From [Master].[' + @user + '].[sysservers] where srvname = ''' + @RserverName + ''') begin Exec sp_droplinkedsrvlogin ''' +  @RserverName + ''',''' + @userID + ''' exec sp_dropserver ''' + @RserverName + ''' end ')


set @RserverName='['+@RserverName+']'
declare @ColumnList varchar(max)
set @ColumnList = null
select  @ColumnList = case when @ColumnList is not null then @ColumnList + ',' + quotename(name) else quotename(name) end  from syscolumns where id = object_id('bditm') order by colid
set identity_insert Bditm on
exec ('Insert Into Bditm ('+ @ColumnList +') Select * From '+ @RserverName + '.'+ @DbName + '.'+ @user + '.Bditm')
set identity_insert Bditm off

set @RserverName=replace(replace(@RserverName,'[',''),']','')

Exec sp_droplinkedsrvlogin  @RserverName,@userID
Exec sp_dropserver @RserverName

当我运行存储过程时,我在不同的执行时间得到不同的错误

有时会显示此错误

"The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ServerName" was unable to begin a distributed transaction."

另一次显示此类错误

OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Protocol error in TDS stream".
OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Communication link failure".
Msg 65535, Level 16, State 1, Line 0
Session Provider: Physical connection is not usable [xFFFFFFFF]. 
OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Communication link failure".
Msg 65535, Level 16, State 1, Line 0
Session Provider: Physical connection is not usable [xFFFFFFFF]. 
OLE DB provider "SQLNCLI" for linked server "70.38.11.49" returned message "Communication link failure".
Msg 10054, Level 16, State 1, Line 0
TCP Provider: An existing connection was forcibly closed by the remote host.

我在客户端使用 Windows Xp 和 SQL Server 2005,在 Net Server 中使用 Windows Server 2003 和 Sql server 2005

我在两个系统中都设置了 MSDTC

我该如何解决这个问题(并提供正确的信息以在 Windows XP 和 Windows server 2003 中设置 MSDTC)

4

5 回答 5

1

你可能想看看:

http://support.microsoft.com/kb/306212

http://support.microsoft.com/kb/937517

于 2009-01-13T16:10:53.013 回答
1

我同意上面的帖子,这可能是一个协议问题,但它可能需要使用命名管道作为接口。

或者可能是运行 DTC 服务的用户帐户仅具有本地权限而没有网络权限。使用在两台计算机上具有足够权限的域帐户来运行 DTC。

或者,您可能需要在流程的前端使用 BEGIN DISTRIBUTED TRANSACTION 启动分布式事务。

于 2009-01-12T04:46:16.500 回答
1

您还必须检查 IP 网络配置中的 DNS 名称解析。

例如,您有一台名为server-a.mydomain.com的服务器和另一台名为server-b.otherdomain.com的服务器,登录server-a并执行ping server-b(没有域)。

如果它响应“ Ping 请求找不到主机服务器-b。请检查名称并重试。 ”这就是问题所在。

转到控制面板>网络连接>右键单击网卡>属性> Internet协议>属性>高级> DNS>按顺序附加此DNS后缀。在这里添加本地域:mydomain.com,然后添加远程域:otherdomain.com。单击确定直到退出

现在,如果您执行ping server-b,它应该会响应如下内容:

ping server-b.otherdomain.com [192.168.1.2] 32 字节数据: 来自 192.168.1.2 的回复:字节=32 时间=12ms TTL=64 来自 192.168.1.2 的回复:字节=32 时间=9ms TTL=64

现在再次尝试执行分布式事务。

于 2010-12-17T18:10:21.157 回答
1

我可以确认这是网络连接问题。我以前见过这个。

MSDTC 代理必须能够连接到它们正在协调的所有数据库实例。

有一些经过 MS 认证的程序来测试这个……google for msdtc ping。

于 2009-12-21T21:30:17.827 回答
0

很长一段时间,但不久前我在 MSSQL Server 7 上遇到了类似的问题。事实证明,两个系统都需要通过 NetBios 名称相互联系,因为它们不是域的一部分(但正在通信在你的情况下通过广域网)。

一个简单的解决方案,至少要检查是否是这种情况,是编辑 lmhosts 文件以映射每个计算机的 IP 地址(在客户端和服务器中)。

看到我当时写的一个有点困惑的帖子: http ://groups.google.com/group/microsoft.public.sqlserver.server/browse_thread/thread/2c246bd2afc7c4d9

于 2009-01-12T01:05:21.313 回答