Consulta CLR en Sql Sever 2008 r2.

150 views
Skip to first unread message

Leandro Peralta

unread,
Apr 8, 2015, 3:49:26 PM4/8/15
to altnet-...@googlegroups.com

Buenas estoy creando un Trigger CLR y dentro del codigo necesito referenciar un dll, cuando la quiero agregar en la base de datos me da este error,

CREATE ASSEMBLY DLLAfip
AUTHORIZATION [dbo]
FROM ‘C:\FEAFIPLib.dll’
WITH PERMISSION_SET = UNSAFE
GO

Error de CREATE ASSEMBLY para el ensamblado ‘FEAFIPLib’ porque se ha generado para una versión incompatible de Common Language Runtime.

valido la version del CLR en sql server

select * from sys.dm_clr_properties

directory D:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\
version v2.0.50727
state CLR is initialized

como puedo hacer para modificar la version del CLR en el sql ya que en la DLL no la puedo cambiar, instale el SP1 y SP2 de sql server 2008 pero sigue figurando la version v2.0.50727.

Espero puedan ayudarme.
Saludos Leandro.

Erick Orlando

unread,
Apr 9, 2015, 1:50:02 PM4/9/15
to altnet-...@googlegroups.com
Hola Leandro, yo tuve exactamente el mismo problema, solo puedes usar esa versión del .NET Framework en SQL 2008.

Si quieres usar .NET 4.0 deberías usar SQL Server 2012.

Saludos.

Miguel Angel Jimenez Perez

unread,
Apr 9, 2015, 4:31:09 PM4/9/15
to altnet-...@googlegroups.com
Efectivamente como menciona Erick Orlando, tienes que compilar la dll en .Net 2.0, no puedes modificar la version que usa Sql server.

Aca en Mexico desde hace algunos años estamos peleandonos tambien con facturacion electronica, en un caso similar a este que mencionas donde habia un problema de incompatibilidad con tecnologias lo que hice fue lo siguiente:

-Cree una dll con metodos que realizaban el proceso de crear la factura, firmarla, timbrarla, y obtener el binario de la firma de la factura, pero que internamente llamaban a un web service (SOAP, desafortunamente la alternativa del proveedor era usar SOAP o su dll, que al final usaba SOAP tambien). Esta dll la puedes hacer tu y compilarla en .Net 2.0. En nuestro caso los metodos eran fire & forget, es decir hacia el llamado SOAP pero solo confirmaba la recepcion de datos, no esperaba al procesamiento. Ahorita aclaro el porque.
-Creamos un webservice que recibia la informacion. Este web service intermedio lo creamos nosotros,porque teniamos que hacer unas verificaciones adicionales con SAP y algunos sistemas legacy, y guardar la factura en un sistema de control de documentos externo(laserfiche,posteriormente Documentum). Y este mandaba a llamar al sistema que hace todo el trabajo de facturacion electronica, usando SOAP.
-Al final con el id de la transaccion o factura, nos conectabamos a la base de datos sql server y ahi haciamos el cambio de estatus de la factura y llenabamos los campos con la informacion generada(firma electronica,id de referencia del documento, etc etc).

Por que fire & forget, como es un trigger(en nuestro caso era dentro de un stored procedure) no puedes tener al sql server blockeando un proceso o esperando por informacion externa, ya que otros tambien estan intentando acceder a la informacion de tu base de datos. A veces los tiempo de esperan eran desde milisegundos hasta varios segundos,dependiendo la carga de trabajo de los sistemas involucrados. Entiendo que quieres usar un trigger porque quieres que cuando se inserte o se actualize se dispare el procesamiento, pero realmente supongo que del otro lado no esperas informacion de retorno aparte de la confirmacion que tu registro fue insertado o actualizado.

Actualmente si volviera a hacer algo asi, lo haria usando REST en lugar de SOAP o alguna cola de mensaje, pero eso es ya algo que sale del tema.

Saludos.


Reply all
Reply to author
Forward
0 new messages