DLLs y SQL Server

23/02/2004 - 04:14 por Odin | Informe spam
Saludos al grupo.

No tengo mucha experiencia con SQL Server 2000. Tengo una serie de
operaciones que debo aplicar a un conjunto de datos, y a falta de otra cosa
mejor, las he agrupado en una DLL ActiveX, hecha en Visual Basic, la cual
funciona bastante bien. El caso es que ahora necesito invocar a esta DLL
desde SQL Server. Esto es, que ante un evento determinado, la DLL se
ejecute.

¿Existe alguna forma de hacerlo? Caso afirmativo ¿Me pueden explicar por
donde va la cosa?

Gracias por adelantado.
 

Leer las respuestas

#1 Odin
23/02/2004 - 05:50 | Informe spam
Adrian. Muchas gracias por la respuesta. Me voy a tomar un tiempo
masticándola, ya que como dije en SQL ando un poco lento, pero suena
bastante parecido a lo que andaba buscando.

Un saludo.
Jose M. Vázquez

"Adrian D. Garcia" escribió en el mensaje
news:uxVLWHc%
Desde codigo T-SQL puedes invocar a tu DLL ActiveX. Hay una serie de
procedimientos almacenados extendidos del motor que te permiten:
1) Crear un objeto ActiveX perteneciente a una clase dada
2) Invocar un metodo o propiedad
3) Liberar el objeto de la memoria

Los procedimientos almacenados extendidos correspondientes son:
1) sp_OACreate progid, | clsid, objecttoken OUTPUT [ , context ]

2) sp_OAMethod objecttoken, methodname [ , returnvalue OUTPUT ] [ , [
@parametername = ] parameter [ OUTPUT ] [ ...n ] ]

sp_OAGetProperty objecttoken, propertyname [ , propertyvalue OUTPUT ]


[ ,
index...]

sp_OASetProperty objecttoken, propertyname, newvalue [ , index... ]

3) sp_OADestroy objecttoken

Aqui tienes un ejemplo de los BOL sobre como crear, utilizar y destruir un
objeto ActiveX. Ve el especial enfasis que ponen en el tratamiento y
manipulacion de errores:

DECLARE @object int
DECLARE @hr int
DECLARE @property varchar(255)
DECLARE @return varchar(255)
DECLARE @src varchar(255), @desc varchar(255)

SET NOCOUNT ON

EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @object OUT
IF @hr <> 0
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
GOTO END_ROUTINE
ELSE
BEGIN
EXEC @hr = sp_OASetProperty @object, 'HostName', 'Gizmo'
IF @hr <> 0 GOTO CLEANUP

EXEC @hr = sp_OAGetProperty @object, 'HostName', @property OUT
IF @hr <> 0
GOTO CLEANUP
ELSE
PRINT @property

EXEC @hr = sp_OAGetProperty @object, 'HostName'
IF @hr <> 0 GOTO CLEANUP

EXEC @hr = sp_OAMethod @object, 'HostName', @property OUT
IF @hr <> 0
GOTO CLEANUP
ELSE
PRINT @property

EXEC @hr = sp_OAMethod @object, 'Connect', NULL, 'my_server',
'my_login', 'my_password'
IF @hr <> 0 GOTO CLEANUP

EXEC @hr = sp_OAMethod @object, 'VerifyConnection', @return OUT
IF @hr <> 0
GOTO CLEANUP
ELSE
PRINT @return
END

CLEANUP:
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
END

BEGIN
EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src,


Description=@desc
END
END

END_ROUTINE:
RETURN


Te recomiendo que si vas a utilizar tu dll desde el motor con estos
procedimientos almacenados extendidos crees una isntancia nueva (si tienes
SQL Server 2000) totalmente separada de los datos y que invoques estos
procedimientos desde esa instancia.
Mi experiencia personal no fue en absoluto buena con la ejecución de
componentes activex dentro del ambiente de ejecucion del motor (la DLL se
carga en el mismo espacio de memoria que el motor). Si la dll tiene un
problema entonces el motor tiene un problema. En mi caso desarrollamos una
DLL que si era invocada desde fuera de SQL Server nunca nos daba problemas
pero al ser invocada dentro del motor se generaba un DUMP en forma


aleatoria
del mismo. Desde ese entonces jure que nunca mas iva a volver a poner un
componente ActiveX dentro del motor.


Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

Preguntas similares