0

我有以下问题:我必须从 LAN 内的各种客户端访问一个 DLL,该 DLL 驻留在承载 SQL Server 的 PC 中。

我需要从所有客户端访问此 DLL 以使其返回合法税务校验和。

我想创建一个 CLR 过程来调用服务器中的 DLL 并返回校验和。

我遵循了一些互联网示例并创建了一个简单的 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() 方法将值作为结果集返回,您必须执行以下操作(警告,未经测试):

[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

然后像这样使用它:

选择 dbo.f_mychecksum(12)

于 2012-05-14T14:33:23.337 回答