【问题标题】:MSDTC on server '' is unavailable. sql server link server error when call stored procedure服务器 '' 上的 MSDTC 不可用。调用存储过程时sql server链接服务器错误
【发布时间】:2017-10-24 07:46:53
【问题描述】:

我有 3 台服务器,这些服务器的名称分别为 ServiceServer、DatabaseServer 和 WarehouseServer。

我在 ServiceServer 上有一个 WCF 服务,它调用 DatabaseServer 中的一个存储过程。

public async void UpdateStatus(NajaResult najaresult, string userid, string IsWorn, string FuelSystem, string ValidTest, string SymfaServiceStatus, string NajaServiceStatus)
{
    string _FuelSystem = (string.IsNullOrEmpty(FuelSystem)) ? "2" : FuelSystem;
    _ctx.Database.ExecuteSqlCommand("EXEC [dbo].[UpdateInquiryStatus] @userid='" + userid + "', @IsWorn='" + IsWorn + "',@FuelSystem='" + _FuelSystem + "',@ValidTest='" + ValidTest + "',@SymfaServiceStatus='" + SymfaServiceStatus + "',@NajaServiceStatus='" + NajaServiceStatus + "' ,"
+ "@Chassis='" + najaresult.Chassis + "',@CarColor=N'" + najaresult.CarColor + "',@MotorNum='" + najaresult.MotorNum + "' ,@Vin='" + najaresult.VinNo + "', @SystemType=N'" + najaresult.SystemType + "',@CarTipe=N'" + najaresult.CarTip + "',@FuelType='" + najaresult.FuelType + "',@Model='" + najaresult.CarModel + "'" + ",@CarType=N'" + najaresult.CarType + "'");
}

这是我的存储过程UpdateInquiryStatus,它位于DatabaseServer:

ALTER PROCEDURE [dbo].[UpdateInquiryStatus]
    @userid nvarchar(max),
    @IsWorn nvarchar(max),
    @FuelSystem nvarchar(max),
    @ValidTest nvarchar(max),
    @SymfaServiceStatus nvarchar(max),
    @NajaServiceStatus nvarchar(max),
    @Vin nvarchar(max),
    @SystemType nvarchar(max),
    @CarTipe nvarchar(max),
    @FuelType nvarchar(max),
    @Model nvarchar(max),
    @Chassis nvarchar(max),
    @CarColor nvarchar(max),
    @MotorNum nvarchar(max),
    @CarType nvarchar(max)
AS   
    INSERT INTO [PRISYMFA22a1\MASSYMSQLSERVER].[DB].[dbo].AutomotiveTemps 
           (id, isworn, validtest, CarColor, CarTipe, CarType, Chassis, 
            FuelSystem, FuelType, Model, MotorNum, SubmitDatetime, 
            SystemType, UserId, VIN)
    VALUES (NEWID(), @IsWorn, @ValidTest, @CarColor, @CarTipe, @CarType, @Chassis,
            @FuelSystem, @FuelType, @Model, @MotorNum, GETDATE(),
            @SystemType, @userid, @Vin)

作为说明,我在DatabaseServer 和WarehouseServer 之间创建了一个链接服务器。

如您所见,我的程序在WarehouseServer 中插入了一条记录,但出现此错误:

服务器“DatabaseServer”上的 MSDTC 不可用。

但是我的 msdtc 正在运行并且所有防火墙都被禁用。我也在组件服务中打开了所有入站和出站远程。但同样的错误被返回

【问题讨论】:

  • 你应该真的使用最合适的数据类型——而不是仅仅出于懒惰而使用nvarchar(max)。 @IsWorn 之类的东西听起来像一个布尔标志 - 使用 BIT。 Id 通常是一个数值 - 使用适当的 numeric 数据类型,如 INT 或 DECIMAL 等,甚至大多数字符串类型很可能真的不需要能够保存 高达 2 GB 的字符串数据 - 为您的参数使用适当的长度!

标签: sql-server wcf stored-procedures msdtc


【解决方案1】:

转到 DatabaseServer 上的组件服务并向下导航到本地 DTC,右键单击并选择属性。

在“安全”选项卡上,确保选中“网络 DTC 访问”和“允许远程客户端”。

选中事务管理器通信下的允许入站(可能还有出站),您可能需要更改身份验证,具体取决于您在数据库服务器和服务服务器上运行的 Windows 版本。

【讨论】:

  • 知道什么时候需要这个吗?我有一个 sql server 实例和一个调用它的报告工具。关闭 MSDTC 后,我有时会收到此错误,有时不会,而执行代码在两种情况下都是相同的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多