Estoy empezando a crear ensambladores
Mi función es
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient
Imports System.IO
Public Class clr
Inherits System.Web.UI.Page
<SqlFunction()> Public Function texto_descarga(ByVal numero As Byte, ByVal
c0 As Integer, ByVal nversion As Byte) As String
Dim strfichero As String, strruta As String, strfichero_principal As String
= Nothing
strruta = "Aplicaciones/"
strfichero = "aplicacion"
strfichero &= c0 & IIf(nversion > 0, "(" & nversion & ")", "")
strruta = Server.MapPath(strruta)
For Each foundFile As String In My.Computer.FileSystem.GetFiles(strruta,
FileIO.SearchOption.SearchTopLevelOnly, strfichero & ".*")
strfichero_principal = foundFile.Substring(InStrRev(foundFile, "\"))
Exit For
Next
If strfichero_principal Is Nothing Then strfichero_principal = "Falta " &
strfichero
Return strfichero_principal
End Function
End Class
Compilo y obtengo la dll con vbc
Luego me creo el ensamblador así
CREATE ASSEMBLY clr
'FROM 'C:\clr.dll' WITH PERMISSION_SET = safe
Pero me sale un error
Error de ejecución SQL.
Instrucción SQL ejecutada: CREATE ASSEMBLY clr FROM 'C:\clr.dll' WITH
PERMISSION_SET = safe
Origen del error: .Net SqlClient Data Provider
Mensaje de error: Error de CREATE ASSEMBLY para el ensamblado 'clr' debido a
un error de comprobación del ensamblado 'System.Drawing'. Compruebe si los
ensamblados a los que se hace referencia están actualizados y son de
confianza (para external_access o unsafe) para ejecutarse en la base de
datos. Después de este mensaje aparecen los mensajes de error de comprobación
de CLR, si los hay
[ :
System.Drawing.BufferedGraphicsContext::bFillColorTable][mdToken=0x6000243][desplazamiento
0x00000053][se encontró address of Byte] Se esperaba un tipo numérico en la
pila.
[ :
System.Drawing.BufferedGraphicsContext::bFillColorTable][mdToken=0x6000243][desplazamiento
0x00000043][se encontró Native Int][se esperaba address of Byte] Tipo no
esperado en la pila.
[ :
System.Drawing.BufferedGraphicsContext::bFillColorTable][mdToken=0x6000243][desplazamiento
0x00000027][se encontró Native Int][se esperaba address of Byte] Tipo no
esperado en la pila.
[ : System.Drawing.Icon::GetShort][mdToken=0x600045f][desplazamiento
0x00000002] Los punte...
No sé qué puede fallar. ¿Tengo que actualizar las dll a las que llaman los 3
imports? ¿Dónde obtengo las actualizaciones?
Por lo que parece, el system.drawing es llamado por System.Web.UI.Page
Pero si no pongo el inherits, no me reconoce el server.mappath, y ese es mi
problema, el usar el server.mappath. Requiere el System.Web.UI.Page
¿Me podeis guiar, por favor?
Muchas gracias de antemano
1) Tu clase clr no debe heredar de System.Web.UI.Page. En realidad no debe
heredar de ninguna clase.
2) Las funciones deben ser Shared.
3) Quita la referencia a System.Drawing.dll y a System.Web.dll
4) Busca otra manera de localizar la ruta al archivo que no sea utilizando
Server.MapPath
5) Si tu función va a acceder a recursos externos tienes que crear el
ensamblado con EXTERNAL ACCESS.
Saludos:
Jesús López
www.solidq.com
"bogal" <bo...@discussions.microsoft.com> escribió en el mensaje
news:42F495D3-BF1E-4545...@microsoft.com...
Gracias, Jesús
Lo hago como dices
Ahora, al crear el ensamblado así:
CREATE ASSEMBLY clr
FROM 'C:\clr.dll' WITH permission_SET = external_access
Error de ejecución SQL.
Instrucción SQL ejecutada: CREATE ASSEMBLY clr FROM 'C:\Documents and
Settings\Martin\Mis documentos\Mis proyectos\Cresolia\bin\clr.dll' WITH
PERMISSION_SET = external_access
Origen del error: .Net SqlClient Data Provider
Mensaje de error: Error de CREATE ASSEMBLY para el ensamblado 'clr' porque
el ensamblado 'clr' no tiene autorización para PERMISSION_SET =
EXTERNAL_ACCESS. El ensamblado está autorizado cuando se produce una de las
siguientes situaciónes: el propietario de la base de datos tiene permiso de
EXTERNAL ACCESS ASSEMBLY y la base de datos tiene definida la propiedad de
base de datos TRUSTWORTHY, o el ensamblado está firmado con un certificado o
una clave asimétrica que tiene un inicio de sesión correspondiente con
permiso de EXTERNAL ACCESS ASSEMBLY.
Estoy intentando ver dónde he de darle el permiso oportuno.
Te agradecería mucho tu ayuda. Saludos.
me da este error:
He de decir que martin=bogal. Es mi otra cuenta de correo
Ya he visto cómo conceder el permiso
USE master
GRANT EXTERNAL access assembly TO <inicio sesion>
El tema es que accedo al sql server con autenticación de windows, y no sé
cómo poner la instrucción gran
Muchas gracias de nuevo
ALTER DATABASE <base de datos> SET TRUSTWORTHY ON
Saludos:
Jesús López
www.solidq.com
"martin" <mar...@discussions.microsoft.com> escribió en el mensaje
news:17F98F54-89BA-4303...@microsoft.com...
Muchísimas gracias, Jesús.
La verdad es que me tenía totalmente loco. Ya puedo cantar y todo :=)
Saludos
He intentado probar la función clr del ensamblado
Me da un error
Error de .NET Framework durante la ejecución de la rutina o agregado
definido por el usuario 'texto_descarga':
System.Security.HostProtectionException: Attempted to perform an operation
that was forbidden by the CLR host.
The protected resources (only available with full trust) were: All
The demanded resources were: ExternalProcessMgmt
System.Security.HostProtectionException:
at
System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Assembly asm,
PermissionSet granted, PermissionSet refused, RuntimeMethodHandle rmh,
SecurityAction action, Object demand, IPermission permThatFailed)
at System.Security.CodeAccessSecurityEngine.ThrowSecurityException(Object
assemblyOrString, PermissionSet granted, PermissionSet refused,
RuntimeMethodHandle rmh, SecurityAction action, Object demand, IPermission
permThatFailed)
at System.Security.CodeAccessSecurityEngine.CheckSetHelper(PermissionSet
grants, PermissionSet refused, PermissionSet demands, RuntimeMethodHandle
rmh, Object assemblyOrString, SecurityAction action, Boolean throwException)
at System.Security.CodeAccessSecurityEngine.CheckSetHelper(CompressedStack
cs, PermissionSet grants, PermissionSet refused, PermissionSet demands,
RuntimeMethodHandle rmh, Assembly asm, SecurityAction action)
at seguimientos.texto_descarga(SqlByte numero, SqlInt32 c0, SqlByte
nversion)
Tal vez tenga que ver con la cadena de conexión. La tengo así
<add name="conexion"
connectionString="SERVER=(local);trusted_connection=true;UID=;DataBase=nuevo;PWD="/>
Gracias por la ayuda. Busco en google, pero me es urgente y algo complicado
de entender
Muchas gracias por la paciencia y ayuda
Todo solucionado.
Por si puede resultar útil. Hay métodos y tipos que no están permitidos en
los sqlclr, udfclr...
En mi caso, al usar recursos externos, no está permitido el uso de
filesystem y sí el uso de file (system.io)
Es lo que se llama el CAS
Gracias, y un saludo
Necesito ver el código de la función para ver lo que hace y que a SQL Server
no le gusta.
¿Seguro que creaste el ensamblado con EXTERNAL ACCESS?
Saludos:
Jesús López
www.soldiq.com
"martin" <mar...@discussions.microsoft.com> escribió en el mensaje
news:978039FB-AAEB-474E...@microsoft.com...