2012-07-26 73 views
10

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?

+1

¿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

+0

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. –

+0

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

Respuesta

17

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.

+0

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 :) –

Cuestiones relacionadas