Estoy tratando de configurar un trabajo SSIS que obtenga una lista de correo codificada JSON de MailChimp, compararla con una lista de clientes en nuestra base de datos CRM (SQL Server) y subir a través de JSON a cualquier cliente nuevo que no esté allí . Parece que no puedo encontrar nada en la serialización/deserialización de JSON dentro de SSIS, aparte de escribir una tarea de script, y parece que no puedo importar las bibliotecas de serialización .Net en un script. ¿Alguna sugerencia? ¡Gracias por adelantado!Parse Datos JSON dentro del paquete de SQL Server Integration Services?
Respuesta
par de cosas para hacer frente aquí:
En primer lugar, su problema con la adición de nuevas bibliotecas en el componente de script. Supongo que está utilizando VS 2008 para hacer su desarrollo de SSIS y desea usar la biblioteca .net 3.5 para hacer esto. Vas a proyecto, añades referencia y no ves ninguno de los dll que necesitas. Esto puede deberse en parte a que está utilizando Windows 7 y el marco compacto 3.5. .net 3.5.1 viene con Windows 7, solo tiene que habilitarlo. Ir al panel de control, programas y características. En esa pantalla, verá Activar o desactivar las características de Windows, haga clic en eso. En esa ventana, compruebe Microsoft .NET Framework 3.5.1, de esta manera, tómese unos minutos para ejecutar. Una vez que termina, busque un directorio similar a estos C: \ Archivos de programa (x86) \ Conjuntos de referencia \ Microsoft \ Framework.NETFramework \ v3.5 \ Profile \ Client y C: \ Archivos de programa (x86) \ Reference Assemblies \ Microsoft \ Framework \ v3.5. Entre estos 2 directorios, encontrará cualquier DLL que necesite para la serialización/deserialización de JSON. Estos se pueden agregar a su proyecto yendo a Proyecto -> Agregar referencia -> Examinar pestaña, luego navegue al directorio v3.5 y seleccione los dlls que necesita (System.Web.Extensions.dll (v3.5.30729.5446)) se usa en este ejemplo).
Para obtener JSON de un servicio web, deserializarlo y enviar los datos a su base de datos CRM, tendrá que usar un componente de script como fuente en su flujo de datos y agregar columnas al búfer de salida que se usará para mantener los datos provenientes de la fuente JSON (en la pantalla de entrada y salida). En el código, tendrá que anular el método CreateNewOutputRows. Aquí está un ejemplo de cómo hacer esto:
Digamos que su JSON se veía así ... [{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0},{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]
Me puño definir una clase para reflejar este atributos de alimentación (JSON y las columnas que ha definido en las entradas y pantalla de salidas) que eventualmente llevará a cabo una vez que estos valores deserializar ... como tal:
class WorkGroupMetric
{
public string CN { get; set; }
public string IN { get; set; }
public int CO { get; set; }
public int CA { get; set; }
public int AB { get; set; }
}
Ahora tiene que llamar al servicio de web y obtener la alimentación JSON utilizando una HttpWebRequest y una corriente:
string wUrl = "YOUR WEB SERVICE URI";
string jsonString;
HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(wUrl);
HttpWebResponse httpWResp = (HttpWebResponse)httpWReq.GetResponse();
Stream responseStream = httpWResp.GetResponseStream();
using (StreamReader reader = new StreamReader(responseStream))
{
jsonString = reader.ReadToEnd();
reader.Close();
}
Ahora Deserialize nuestra JSON en una matriz de WorkGroupMetric
JavaScriptSerializer sr = new JavaScriptSerializer();
WorkGroupMetric[] jsonResponse = sr.Deserialize<WorkGroupMetric[]>(jsonString);
Después de deserializar, ahora podemos dar salida a las filas en el búfer de salida:
foreach (var metric in jsonResponse)
{
Output0Buffer.AddRow();
Output0Buffer.CN = metric.CN;
Output0Buffer.IN = metric.IN;
Output0Buffer.CO = metric.CO;
Output0Buffer.CA = metric.CA;
Output0Buffer.AB = metric.AB;
}
Esto es lo que todo el código se ponen juntos parecen (tengo un ejemplo paso a paso here):
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Net;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
using System.Web.Script.Serialization;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
public override void CreateNewOutputRows()
{
string wUrl = "YOUR WEB SERVICE URI";
try
{
WorkGroupMetric[] outPutMetrics = getWebServiceResult(wUrl);
foreach (var metric in outPutMetrics)
{
Output0Buffer.AddRow();
Output0Buffer.CN = metric.CN;
Output0Buffer.IN = metric.IN;
Output0Buffer.CO = metric.CO;
Output0Buffer.CA = metric.CA;
Output0Buffer.AB = metric.AB;
}
}
catch (Exception e)
{
failComponent(e.ToString());
}
}
private WorkGroupMetric[] getWebServiceResult(string wUrl)
{
HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(wUrl);
HttpWebResponse httpWResp = (HttpWebResponse)httpWReq.GetResponse();
WorkGroupMetric[] jsonResponse = null;
try
{
if (httpWResp.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = httpWResp.GetResponseStream();
string jsonString;
using (StreamReader reader = new StreamReader(responseStream))
{
jsonString = reader.ReadToEnd();
reader.Close();
}
JavaScriptSerializer sr = new JavaScriptSerializer();
jsonResponse = sr.Deserialize<WorkGroupMetric[]>(jsonString);
}
else
{
failComponent(httpWResp.StatusCode.ToString());
}
}
catch (Exception e)
{
failComponent(e.ToString());
}
return jsonResponse;
}
private void failComponent(string errorMsg)
{
bool fail = false;
IDTSComponentMetaData100 compMetadata = this.ComponentMetaData;
compMetadata.FireError(1, "Error Getting Data From Webservice!", errorMsg, "", 0, out fail);
}
}
class WorkGroupMetric
{
public string CN { get; set; }
public string IN { get; set; }
public int CO { get; set; }
public int CA { get; set; }
public int AB { get; set; }
}
Esto ahora se puede usar como una entrada para una Desti de datos nación (su base de datos CRM). Una vez allí, puede usar SQL para comparar los datos y buscar discrepancias, enviar los datos a otro componente de script para serializar y enviar las actualizaciones que necesite al servicio web.
O
se puede hacer todo en el componente de secuencia de comandos y los datos no salida al buffer de salida. En esta situación, aún necesitaría deserializar el JSON, pero colocar los datos en algún tipo de colección. Luego use el marco de entidad y LINQ para consultar su base de datos y la colección. Determine qué no coincide, serialícelo y envíelo al servicio web en el mismo componente de script.
En general tengo sentimientos un tanto ambivalentes sobre las personas que hacen todo el trabajo para los demás aquí en SO, ¡pero +1 para obtener una respuesta muy completa! Muy útil :) –
- 1. alternativas de código abierto para SQL Server Integration Services
- 2. servidor SQL Integration Services 2008-2005 compatibilidad
- 3. ¿Cómo puedo fallar manualmente un paquete en Integration Services?
- 4. Actualizar metadatos del esquema de destino en Integration Services
- 5. Parse JSON del objeto HttpURLConnection
- 6. ¿Ventajas de usar SQL Server Reporting Services?
- 7. ¿Qué es SQL Server Reporting Services?
- 8. Parse JSON de JQuery.ajax éxito datos
- 9. SQL Server Reporting Services para Amazon RDS
- 10. SSIS: No veo el asistente de configuración del paquete
- 11. SQL Server Reporting Services Round() función
- 12. Ejecutar el paquete SSIS de SQL Server del procedimiento almacenado
- 13. Parse JSON en Python
- 14. iOS JSON NSString Parse
- 15. ¿Cómo instalar SQL Server Reporting Services (SSRS) en una instalación existente de SQL Server Express?
- 16. copiar una base de datos dentro de SQL Server Express?
- 17. Parse JSON en ANSI C
- 18. Cómo usar WebService de SQL Server 2008 Reporting Services
- 19. Parse JSON de Google Spreadsheet
- 20. SQL Server Reporting Services Suscripción con parámetros dinámicos
- 21. paquete Parse SIP en C
- 22. ¿Cómo visualizo CheckBoxes en SQL Server Reporting Services?
- 23. Reporting Services disponibilidad de SQL Server Express 2008 R2
- 24. Generar reporte de URL - SQL Server Reporting Services 2008
- 25. Parse $ .extend configuración del atributo de datos
- 26. SQL Server Reporting Services Datasource sigue perdiendo credenciales de inicio de sesión de base de datos
- 27. Fuente personalizada en SQL Server 2005 Reporting Services
- 28. ¿Cómo uso MySQL como origen de datos en Microsoft SQL Server Analysis Services?
- 29. Parse json con gwt 2.0
- 30. Cadena Parse Json en C#
¿Por qué no puede importar las clases de serialización? Alguien parece haber [hecho esto ya] (http://timlaqua.com/2011/07/consuming-an-authenticated-json-feed-with-ssis/) utilizando un Componente de Script. – Pondlife
No pude importar el espacio de nombres System.Web.Script que contiene la clase JavaScriptSerializer que estaba intentando usar; Supongo que hay un límite en cuanto a las importaciones que puede realizar en una tarea de secuencia de comandos (?). Sin embargo, ese artículo que anotó ofrece una solución a esto, que es importar System.Runtime.Serialization.Json. Había visto ese artículo pero lo leí demasiado rápido y olvidé ese punto, gracias por llamar mi atención. –
No debe haber un límite para las importaciones, pero todo lo que no se muestre se puede agregar a través del GAC y la carpeta del SDK de SQL Server. Esta es también la forma en que agregaría sus propias DLL personalizadas a un paquete. – GShenanigan