Bartłomiej
W.
Senior Software
Engineer, Cegedim
Group Poland Sp. z
o.o.
Temat: Wykorzystanie DLL w procedurach opartych na środowisku CLR
Witam,mam mały problem.
chciałbym mieć dostęp z poziomu MS SQL 2005 do funkcji znajdujących się w bibliotece MyDLL.dll (dla przykładu: funkcja int add (int i, int j) ).
W tym celu użyłem mechanizmu CLR, tworząc odpowiednią bibliotekę CLR o nazwie MyCLR.dll, zawierającą funkcję int add (int i, int j).
Po zarejestrowaniu assembly i storedProcedure w MS SQL wszystko działa w przpadku gdy sam napiszę w MyCLR funkcję add jako np return i + j.
Problem: czy i jak mogę wykorzystać w MyCLR.dll funkcję add z MyDLL.dll.
w projekcie MyCLR ustawiłem Common Language Runtime Support jako /clr: pure,
Assembly Permision Level jako UNSAFE.
w MyCLR próbuję odwołać się do MyDLL przez (w uproszczeniu pomijam obsługę ewentualnych błędów):
...
...
[Microsoft::SqlServer::Server::SqlProcedure]
static int add(int i, int j)
{
typedef int (*CALLBACK LPFNDLLFUNC1)(int,int);
HINSTANCE hDLL = NULL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
hDLL = LoadLibrary(L"MyDLL.dll");
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"add");
int i = lpfnDllFunc1(4,6);
return i;
}
w MS SQL rejestruję jako:
CREATE ASSEMBLY assembly_add
FROM 'c:\_clr\Proj.dll'
WITH PERMISSION_SET = UNSAFE
go
CREATE PROCEDURE MyStoredProc @i int, @j int
AS EXTERNAL NAME assembly_add.[add].MyStoredProc
do tej pory wszystko przebiega pomyślnie, jednak gdy wywołuję procedurę:
declare @w int
exec @w = MyStoredProc 6,2
print @w
pojawia się błąd:
Msg 6522, Level 16, State 1, Procedure MyStoredProc, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "MyStoredProc": .