2012-07-26 11 views
10

Sto provando a impostare un processo SSIS che estrarrà una mailing list con codifica JSON da MailChimp, la confronta con un elenco di clienti nel nostro database CRM (SQL Server) e carica tramite JSON eventuali nuovi clienti non già lì . Non riesco a trovare nulla sulla serializzazione/deserializzazione di JSON all'interno di SSIS, oltre alla scrittura di un'attività di script, e sembra che non sia possibile importare le librerie di serializzazione .Net in uno script. Eventuali suggerimenti? Grazie in anticipo!Analizzare i dati JSON all'interno del pacchetto SQL Server Integration Services?

+1

Perché non è possibile importare le classi di serializzazione? Qualcuno sembra averlo già fatto (http://timlaqua.com/2011/07/consuming-an-authenticated-json-feed-with-ssis/) usando un componente Script. – Pondlife

+0

Non è stato possibile importare lo spazio dei nomi System.Web.Script che contiene la classe JavaScriptSerializer che stavo tentando di utilizzare; Presumo che ci sia un limite a ciò che le importazioni si possono fare in una Script Task (?). Tuttavia, l'articolo che hai notato offre una soluzione a questo, che è di importare System.Runtime.Serialization.Json. Avevo visto quell'articolo ma lo leggevo troppo in fretta e mi mancava quel punto, grazie per averlo riportato alla mia attenzione. –

+0

Non ci dovrebbe essere un limite alle importazioni, ma tutto ciò che non viene visualizzato può essere aggiunto tramite GAC e la cartella SDK di SQL Server. Questo è anche il modo in cui aggiungere le DLL personalizzate a un pacchetto. – GShenanigan

risposta

17

cose Coppia per affrontare qui:

primo luogo, il problema con l'aggiunta di nuove librerie nel componente di scripting. Presumo che tu stia utilizzando VS 2008 per eseguire lo sviluppo di SSIS e che desideri utilizzare la libreria .net 3.5 per farlo. Vai al progetto, aggiungi riferimento e non vedi nessuna delle dll di cui hai bisogno. Questo potrebbe essere in parte il fatto che stai usando Windows 7 e il framework compatto 3.5. .net 3.5.1 viene fornito con Windows 7, devi solo abilitarlo. Vai a pannello di controllo, programmi e funzionalità. In quella schermata vedrai Attivare o disattivare le funzionalità di Windows, fai clic su di esso. In questa finestra controlla Microsoft .NET Framework 3.5.1, in questo modo sono necessari alcuni minuti per l'esecuzione. Al termine, cercare una directory simile a questi C: \ Programmi (x86) \ Assiemi di riferimento \ Microsoft \ Framework.NETFramework \ v3.5 \ Profile \ Client e C: \ Programmi (x86) \ Assiemi di riferimento \ Microsoft \ Framework \ v3.5. Tra queste 2 directory, troverai qualsiasi dll di cui avrai bisogno per la serializzazione/deserializzazione di JSON. Questi possono essere aggiunti al progetto andando a Progetto -> Aggiungi riferimento -> Sfoglia scheda, quindi accedere alla directory v3.5 e selezionare le DLL necessarie (System.Web.Extensions.dll (v3.5.30729.5446) è usato in questo esempio).

Per ottenere JSON da un servizio Web, deserializzare e inviare i dati al database CRM, sarà necessario utilizzare un componente di script come origine nel flusso di dati e aggiungere colonne al buffer di output che verrà utilizzato per contenere i dati provenienti dal feed JSON (nella schermata Input e Output). Nel codice, dovrai eseguire l'override del metodo CreateNewOutputRows. Ecco un esempio di come fare questo:

dire la vostra JSON si presentava così ... [{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0},{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]

avrei pugno definire una classe di rispecchiare questo gli attributi dei feed JSON (e le colonne definite sugli ingressi e schermo uscite) che finirà per tenere questi valori una volta che si deserializzare ... come tale:

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; } 
} 

Ora è necessario chiamare il servizio web e ottenere il feed JSON utilizzando un HttpWebRequest e un flusso:

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(); 
      } 

Ora deserializzare nostro JSON in un array di WorkGroupMetric

JavaScriptSerializer sr = new JavaScriptSerializer(); 
WorkGroupMetric[] jsonResponse = sr.Deserialize<WorkGroupMetric[]>(jsonString); 

Dopo deserializzazione, possiamo ora uscita le righe per il buffer di uscita:

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; 
     } 

Ecco cosa tutto il codice messo insieme sarebbe sembrano (ho un passo dopo passo esempio 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; } 
} 

Questo può ora essere utilizzato come un ingresso per un desti dati nazione (il tuo database CRM). Una volta lì, è possibile utilizzare SQL per confrontare i dati e trovare disallineamenti, inviare i dati a un altro componente di script per serializzare e inviare eventuali aggiornamenti necessari al servizio web.

O

si può fare tutto nella componente di script e dati non in uscita al buffer di output. In questa situazione avresti ancora bisogno di deserializzare il JSON, ma inserire i dati in una sorta di raccolta. Quindi utilizzare l'entity framework e LINQ per interrogare il database e la raccolta. Determinare ciò che non corrisponde, serializzarlo e inviarlo al servizio Web nello stesso componente di script.

+0

In generale ho sentimenti un po 'ambivalenti su chi fa tutto il lavoro per gli altri qui su SO, ma +1 per una risposta molto completa! Molto utile :) –

Problemi correlati