0

次の問題があります。SQL Server をホストする PC に存在する、LAN 内のさまざまなクライアントから DLL にアクセスする必要があります。

すべてのクライアントからこの DLL にアクセスして、法的な税金のチェックサムを返すようにする必要があります。

サーバーで DLL を呼び出してチェックサムを返す CLR プロシージャを作成することを考えました。

私はいくつかのインターネットの例に従い、単純な HelloWorld アプリを作成しました....

C# で DLL を作成しました

[SqlProcedure]
public static int HelloWorld(int h)
{
    return h;
}

SQL Server でアセンブリを作成しました。

CREATE ASSEMBLY MyChecksum
    from 'C:\Users\Panos\Documents\Visual Studio 2010\Projects\DigitalSignature\Algobox\bin\Debug\checksum.dll'
    WITH PERMISSION_SET = UNSAFE  

手順を作成しました

CREATE PROC sp_mychecksum (@h int)
AS
EXTERNAL NAME MyAlgobox.Signatures.HelloWorld 

要するに、プロシージャを実行すると ( ) メッセージしか表示されないということです。exec sp_mychecksum
12

コマンドが正常に完了しました

12ではなく

手がかりはありますか?

4

1 に答える 1

1

定義した方法では、HelloWorld() メソッドからの戻り値がストアド プロシージャの戻り値として返されます。したがって、質問のコメントで@Damien_The_Unbelieverが示唆しているように、これにより、SQL Serverで探しているものが得られます。

DECLARE @rc int
EXEC @rc = sp_mychecksum 12
SELECT @rc

HelloWorld() メソッドが値を結果セットとして返すようにするには、次のようにする必要があります ( warning, untested ):

[SqlProcedure]
public static int HelloWorld(int h) {
    SqlDataRecord record = new SqlDataRecord(new SqlMetaData("colname", SqlDbType.Int));
    record.SetSqlInt32(0, h);
    SqlContext.Pipe.Send(record);
}

ただし、ユース ケースを考えると、ストアド プロシージャではなく、既存の CLR ルーチンを SQL 関数にマップする必要があると思います。たとえば、次のようなものです。

CREATE FUNCTION dbo.f_mychecksum(@h int) RETURNS int
WITH EXECUTE AS CALLER 
AS
EXTERNAL NAME MyAlgobox.Signatures.HelloWorld

そして、次のように使用します。

SELECT dbo.f_mychecksum(12)

于 2012-05-14T14:33:23.337 に答える