visual-studio-2008 - temas - visual studio code html
¿Por qué SSIS no puede crear esta tarea? (1)
Pude recrear el problema que estás enfrentando. El siguiente ejemplo describe cómo recrear el problema y también cómo solucionarlo. Usé Visual Studio 2010
para crear la DLL de biblioteca de clases, pero la versión de framework de destino era 2.0. La tarea Control Flow se agregó al proyecto SSIS 2008 R2
, que es más o menos lo mismo que SSIS 2008.
Proceso paso a paso:
En Visual Studio 2010 IDE, creó un proyecto de biblioteca de clase C # y lo llamó HttpTask . Referencia captura de pantalla # 1 . Se eliminaron todas las referencias excepto las requeridas. Se agregó una referencia a la DLL Microsoft.SQLServer.ManagedDTS , que estaba disponible en la ruta
c:/Program Files (x86)/Microsoft SQL Server/100/SDK/Assemblies/Microsoft.SQLServer.ManagedDTS.dll
en mi máquina. La ruta puede ser diferente en función de la versión de SQL Server que haya instalado. 100 en la ruta representa SQL Server 2008 o SQL Server 2008 R2.Se cambió el nombre de la clase Program.cs a
HttpTask.cs
y se pegó el código que se muestra en la captura de pantalla n.º 2 . El código es exactamente el mismo que se proporciona en la pregunta. El código también se proporciona bajo la sección C # Class Code .En las propiedades del proyecto de la biblioteca de clase, se modificó la versión del marco de destino a
.NET Framework 2.0
. Consulte la captura de pantalla n. ° 3 .Se configuró la línea de comando del evento Post-build como se muestra en las capturas de pantalla # 4 y # 5 . La ruta de acceso de gacutil.exe en mi equipo era
C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Bin/gacutil.exe
. La ruta puede ser diferente en tu máquina. El script también se proporciona en la sección de línea de comandos del evento Post-Build .La biblioteca de la clase no se firmó en este momento. Consulte la captura de pantalla n. ° 6 .
El proyecto se construyó pero el dll no se registró en GAC (Global Assembly Cache). Referencia captura de pantalla # 7 .
Verificó que el archivo DLL se copió correctamente en la ruta
C:/Program Files (x86)/Microsoft SQL Server/100/DTS/Tasks/
. Referencia captura de pantalla # 8 .Verificó que la DLL no estaba presente en la carpeta GAC
C:/windows/assembly
. Consulte la captura de pantalla n. ° 9 .Creó un nuevo paquete de SSIS. En la caja de herramientas de la ficha Flujo de control del paquete SSIS, haga clic derecho en la sección
Control Flow Items
y seleccioneChoose Items...
Consulte la captura de pantalla n. ° 10 .En Elegir elementos de la caja de herramientas, seleccione la pestaña
SSIS Control Flow Items
y seleccione la tarea HTTP de control. Consulte screnshot # 11 .Intenté arrastrar y soltar la tarea en la pestaña Flujo de control y recibí el mismo error que se muestra en la pregunta. Consulte la captura de pantalla n. ° 12 . Entonces, los pasos anteriores describen cómo simular el problema. Ahora, los siguientes pasos describen cómo solucionarlo.
Ahora, volví al proyecto de la biblioteca de clase y hice clic en Propiedades. Esta vez firmé el proyecto con Strong Name Key. Consulte la captura de pantalla n. ° 13 .
Verificó que el archivo de clave de nombre fuerte se haya agregado al proyecto. Referencia captura de pantalla # 14 .
Construyó el proyecto. Esta vez, la DLL se agregó con éxito al GAC. Referencia captura de pantalla # 15 .
Verificó que el archivo DLL se copió correctamente en la ruta
C:/Program Files (x86)/Microsoft SQL Server/100/DTS/Tasks/
. Referencia captura de pantalla # 8 .Verificó que la DLL estaba presente en la carpeta GAC
C:/windows/assembly
. Consulte la captura de pantalla n. ° 16 .En el paquete SSIS, eliminó la tarea HTTP de control de la sección Elementos de flujo de control en la Caja de herramientas. Consulte la captura de pantalla n. ° 17 .
Repite los pasos 9 y 10 para volver a agregar la tarea a la caja de herramientas.
Arrastró y soltó la tarea en la pestaña Flujo de control y la tarea apareció correctamente. No hubo errores esta vez. Consulte la captura de pantalla n. ° 18 .
Espero que ayude.
C # Class Code:
using Microsoft.SqlServer.Dts.Runtime;
namespace HttpTask
{
[DtsTask(
DisplayName = "HTTP Task",
TaskContact = "Iain Elder",
RequiredProductLevel = DTSProductLevel.None
)]
public class HttpTask : Task
{
public string LocalPath { get; set; }
public string Connection { get; set; }
public bool OverwriteDestination { get; set; }
public DTSExecResult Execute(Connections connections,
VariableDispenser dispenser, IDTSComponentEvents events,
IDTSLogging log, object transaction)
{
HttpClientConnection http = AcquireHttpConnection(connections);
http.DownloadFile(this.LocalPath, this.OverwriteDestination);
return DTSExecResult.Success;
}
private HttpClientConnection AcquireHttpConnection(Connections connections)
{
ConnectionManager cm = connections[this.Connection];
object nativeConnection = cm.AcquireConnection(null);
return new HttpClientConnection(nativeConnection);
}
}
}
Línea de comando de evento posterior a la construcción:
"C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Bin/gacutil.exe"
/if "$(TargetPath)"
copy $(TargetFileName)
"C:/Program Files (x86)/Microsoft SQL Server/100/DTS/Tasks/"
Captura de pantalla n. ° 1:
Captura de pantalla n. ° 2:
Captura de pantalla n. ° 3:
Captura de pantalla n. ° 4:
Captura de pantalla n. ° 5:
Captura de pantalla n.º 6:
Captura de pantalla n. ° 7:
Captura de pantalla n. ° 8:
Captura de pantalla n. ° 9:
Captura de pantalla n. ° 10:
Captura de pantalla n. ° 11:
Captura de pantalla n.º 12:
Captura de pantalla n.º 13:
Captura de pantalla n.º 14:
Captura de pantalla n.º 15:
Captura de pantalla n.º 16:
Captura de pantalla n.º 17:
Captura de pantalla n.º 18:
He escrito este código para implementar una tarea de flujo de control de SSIS que recupera un archivo a través de HTTP:
using System;
using Microsoft.SqlServer.Dts.Runtime;
namespace HttpTask
{
[DtsTask(
DisplayName = "HTTP Task",
TaskContact = "Iain Elder",
RequiredProductLevel = DTSProductLevel.None
)]
public class HttpTask : Task
{
public string LocalPath {get; set;}
public string Connection {get; set;}
public bool OverwriteDestination {get; set;}
public DTSExecResult Execute(Connections connections,
VariableDispenser dispenser, IDTSComponentEvents events,
IDTSLogging log, object transaction)
{
HttpClientConnection http = AcquireHttpConnection(connections);
http.DownloadFile(this.LocalPath, this.OverwriteDestination);
return DTSExecResult.Success;
}
private HttpClientConnection AcquireHttpConnection(Connections connections)
{
ConnectionManager cm = connections[this.Connection];
object nativeConnection = cm.AcquireConnection(null);
return new HttpClientConnection(nativeConnection);
}
}
}
En Visual Studio construyo e implemente mi tarea usando este script post-build para copiar el paquete a la memoria caché de ensambles global:
"C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bin/gacutil.exe" /if "$(TargetPath)"
copy $(TargetFileName) "C:/Program Files (x86)/Microsoft SQL Server/100/DTS/Tasks"
Puedo ver la tarea en mi caja de herramientas cuando uso Business Intelligence Development Studio:
Cuando arrastro la tarea a la ventana de diseño, veo este error:
La tarea no aparece en el lienzo de diseño.
¿Qué he hecho mal aquí?
EDITAR: Siva sugirió que debería firmar la asamblea con un nombre fuerte. Seguí los pasos 1 y 2 de la guía para firmar asambleas en el blog de Benny Austin . No seguí los otros pasos porque mi script post-build despliega el componente por mí.
En las propiedades del proyecto de Visual Studio, voy a la pestaña Firma y creo un nuevo archivo de clave de nombre seguro para el ensamblado:
Guardo la configuración y reconstruyo el paquete. El script post-build despliega el nuevo paquete.
Todavía obtengo exactamente el mismo error.