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

私は自分の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 に答える
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 に答える