2012-05-14 4 views
0

У меня есть следующая проблема: у меня должна быть доступная DLL от различных клиентов внутри локальной сети, которая находится на ПК, на котором размещен SQL Server.Получение результатов из SQLCLR

Мне нужно получить доступ к этой DLL от всех клиентов, чтобы вернуть контрольную сумму юридического налога.

Я думал создать CLR-процедуру, которая вызывает DLL на сервере и возвращает контрольную сумму.

Я следовал некоторым примерам интернета и создал простое HelloWorld приложения ....

Я создал DLL в C#

[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
) я получаю только сообщение

Command (s) успешно завершена

, а не 12

Любые улики?

+0

Что вы получите, если вы запускаете 'объявить @rc Int; exec @rc = sp_mychecksum 12; выберите @ rc'? –

+0

На этом сайте представлены отличные примеры реализации CLR-скалярных и табличных функций, а также хранимых процедур: http://www.wisesoft.co.uk/articles/sql_server_clr_io_utility.aspx Они также очень удобны в вашем арсенале , – brian

ответ

0

Как вы определили вещи, возвращаемое значение из метода 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)

+0

Thanx Clark и Damien !! – PanosPlat

+0

Thanx! Но теперь мне нужно, чтобы контрольная сумма строки возвращалась функцией DLL, и в ней говорится, что может быть возвращен только Int, BigInt – PanosPlat

Смежные вопросы