0

我有一个创建新链接服务器的存储过程。

问题是我的 InstanceName 是“my-pc”(包含“-”),因此无法正确生成 LinkedServer。我的猜测是我从 c# 代码传递参数的方式存在问题,但我找不到解决方案。

我的程序是:

CREATE PROCEDURE 
    [test].[createlinkedserver] 
    (
         @InstanceName  AS SYSNAME
    )
AS

BEGIN

    EXECUTE sys.sp_addlinkedserver
        @server     = N'Server' ,
        @srvproduct = N'' ,
        @provider   = N'SQLNCLI' ,
        @datasrc    = [@InstanceName] ,
        @location   = NULL ,
        @provstr    = NULL ,
        @catalog    = NULL



    EXECUTE master.dbo.sp_serveroption
        @server     = N'Server' ,
        @optname    = N'rpc out' ,
        @optvalue   = N'true'



    EXECUTE master.dbo.sp_serveroption
        @server     = N'Server' ,
        @optname    = N'remote proc transaction promotion' ,
        @optvalue   = N'true'


END

我从 c# 调用存储过程:

    DbCommand Command = CovertixDB.Database.GetStoredProcCommand("test.createlinkedserver");
    CovertixDB.Database.AddInParameter(Command, "InstanceName", DbType.String,  instanceName);
    CovertixDB.Database.ExecuteNonQuery(Command);
4

3 回答 3

0

您需要确切知道从 c# 应用程序传递到 SQL 的内容。要进一步尝试将转义转移到 SQL 中,请尝试以下操作:

DECLARE @EscapedInstanceName nvarchar(128)
SET @EscapedInstanceName = '[' + @InstanceName + ']'

EXECUTE sys.sp_addlinkedserver
    @server     = @EscapedInstanceName ,
    @srvproduct = N'' ,
    @provider   = N'SQLNCLI' ,
    @datasrc    = @EscapedInstanceName ,
    @location   = NULL ,
    @provstr    = NULL ,
    @catalog    = NULL

然后查看生成的服务器名称。这将告诉您将要进入 DataSource 的字符串。

于 2013-02-21T02:51:43.160 回答
0

这行不通!@datasrc = [@InstanceName] 保留为其他参数:

@datasrc = @InstanceName

而是更改您的 C# 代码,如下所示:

DbCommand Command = CovertixDB.Database.GetStoredProcCommand("test.createlinkedserver");
CovertixDB.Database.AddInParameter(Command, "InstanceName", DbType.String,  "[" + instanceName + "]");
CovertixDB.Database.ExecuteNonQuery(Command);
于 2013-02-19T09:11:08.690 回答
0

我将我的 c# 更改为:

  DbCommand Command = CovertixDB.Database.GetStoredProcCommand("test.createlinkedserver");
    CovertixDB.Database.AddInParameter(Command, "InstanceName", DbType.AnsiString,  instanceName);
    CovertixDB.Database.ExecuteNonQuery(Command);

我将第 2 行从 DbType.String 更改为 DbType.AnsiString。

然后它起作用了。

实际上,我不太明白为什么,因为 c# DbType.String 适合 NCHAR、NVARCHAR,而 DbType.AnsiString 适合 CHAR、VARCHAR。

我希望它可以与 DbType.String 一起使用...

有人对此有任何解释吗?

于 2013-02-21T14:39:10.880 回答