我有以下问题:我必须从局域网内的各种客户端访问一个DLL,该DLL驻留在驻留SQL Server的PC中。
我需要访问这个DLL从所有客户端,以使它返回一个合法的税收核对。
我想创建一个CLR过程,它调用服务器中的DLL并返回校验和。
我遵循一些互联网的例子,并创建了一个简单的HelloWorld应用程序..。
我在C#中创建了一个DLL
[SqlProcedure]
public static int HelloWorld(int h)
{
return h;
}我在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
有什么线索吗?
发布于 2012-05-14 14:33:23
按照定义事物的方式,来自HelloWorld()方法的返回值将作为存储过程的返回值返回。因此,正如@Damien_The_Unbeliever在对您的问题的评论中所建议的,这将使您在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)
https://stackoverflow.com/questions/10584125
复制相似问题