2012-07-26 7 views
10

Ich versuche einen SSIS-Job einzurichten, der eine JSON-codierte Mailing-Liste von MailChimp abruft, mit einer Liste von Kunden in unserer CRM-Datenbank (SQL Server) vergleicht und neue Kunden, die noch nicht dort sind, über JSON hochlädt . Ich kann anscheinend nichts über das Serialisieren/Deserialisieren von JSON in SSIS finden, außer das Schreiben einer Skriptaufgabe, und es scheint, dass ich die .Net-Serialisierungsbibliotheken nicht in ein Skript importieren kann. Irgendwelche Vorschläge? Danke im Voraus!JSON-Daten im SQL Server Integration Services-Paket analysieren?

+1

Warum können Sie die Serialisierungsklassen nicht importieren? Jemand scheint [dies bereits getan] (http://timlaqua.com/2011/07/consuming-an-authenticated-json-feed-with-ssis/) mit einer Skriptkomponente. – Pondlife

+0

Ich konnte den System.Web.Script-Namespace, der die JavaScriptSerializer-Klasse enthält, die ich verwenden wollte, nicht importieren. Ich nehme an, es gibt ein Limit für die Importe, die Sie in eine Skriptaufgabe (?) Machen können. Dieser von Ihnen notierte Artikel bietet jedoch eine Lösung für das Importieren von System.Runtime.Serialization.Json. Ich hatte diesen Artikel gesehen, aber ich habe ihn zu schnell gelesen und diesen Punkt verpasst - danke, dass er mich darauf aufmerksam gemacht hat. –

+0

Die Importe sollten nicht begrenzt sein, aber alles, was nicht angezeigt wird, kann über den GAC und den SQL Server SDK-Ordner hinzugefügt werden. Auf diese Weise würden Sie auch eigene benutzerdefinierte DLLs zu einem Paket hinzufügen. – GShenanigan

Antwort

17

Paar Dinge hier zu adressieren:

Zuerst Ihr Problem mit neuen Bibliotheken in der Skriptkomponente hinzufügen. Ich nehme an, dass Sie VS 2008 verwenden, um Ihre SSIS-Entwicklung durchzuführen, und die .net 3.5-Bibliothek dazu verwenden möchten. Sie gehen zum Projekt, fügen eine Referenz hinzu und Sie sehen keine der benötigten DLLs. Dies kann teilweise sein, dass Sie Windows 7 und das kompakte 3.5-Framework verwenden. .net 3.5.1 kommt mit Windows 7, Sie müssen es nur aktivieren. Gehe zu Systemsteuerung, Programmen und Funktionen. Auf diesem Bildschirm werden Windows-Funktionen ein- oder ausgeschaltet. Klicken Sie darauf. In diesem Fenster überprüfen Sie Microsoft .NET Framework 3.5.1, auf diese Weise dauert es ein paar Minuten zu laufen. Sobald es fertig ist, suchen Sie nach einem Verzeichnis, das diesen C: \ Programme (x86) \ Referenzassemblies \ Microsoft \ Framework.NETFramework \ v3.5 \ Profile \ Client und C: \ Programme (x86) \ Reference Assemblies \ Microsoft \ ähnlich ist. Framework \ v3.5. Zwischen diesen beiden Verzeichnissen finden Sie alle DLLs, die Sie für die Serialisierung/Deserialisierung von JSON benötigen. Diese können Ihrem Projekt hinzugefügt werden, indem Sie zu Projekt -> Verweis hinzufügen -> Registerkarte Durchsuchen gehen, dann zum Verzeichnis v3.5 navigieren und die benötigten DLLs (System.Web.Extensions.dll (v3.5.30729.5446) auswählen) wird in diesem Beispiel verwendet).

Um JSON von einem Webdienst zu erhalten, zu deserialisieren und die Daten an Ihre CRM-Datenbank zu senden, müssen Sie eine Skriptkomponente als Quelle in Ihrem Datenfluss verwenden und Ihrem Ausgabepuffer Spalten hinzufügen, die verwendet werden um die Daten aus dem JSON-Feed zu halten (auf dem Eingabe- und Ausgabebildschirm). Im Code müssen Sie die CreateNewOutputRows-Methode überschreiben. Hier ist ein Beispiel dafür, wie dies zu tun:

Sagen Sie Ihre JSON so aussah ... [{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0},{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]

Ich würde Faust eine Klasse definieren dieses JSON-Feed Attribute zu spiegeln (und die Spalten, die Sie an den Eingängen definiert und Ausgänge Bildschirm), die diese Werte schließlich halten, sobald Sie ... als solche deserialisieren:

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

Jetzt müssen Sie Ihren Web-Service anrufen und den JSON-Feed mit einem HttpWebRequest und einen Strom erhalten:

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

Jetzt ist unser json in ein Array von WorkGroupMetric wir

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

Nach Deserialisieren deserialisieren, können wir jetzt geben die Zeilen an den Ausgabepuffer:

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

Hier ist, was der gesamte Code zusammengesetzt würde aussehen (ich einen Schritt für Schritt Beispiel habe 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; } 
} 

Dies kann nun als Input für ein Datum desti verwendet werden Nation (Ihre CRM-Datenbank). Dort können Sie SQL verwenden, um die Daten zu vergleichen und Übereinstimmungen zu finden, die Daten zur Serialisierung an eine andere Skriptkomponente zu senden und alle benötigten Aktualisierungen zurück an den Webdienst zu senden.

ODER

Sie können alles in der Skriptkomponente tun und nicht Ausgabedaten an den Ausgangspuffer. In diesem Fall müssten Sie die JSON-Datei noch deserialisieren, aber die Daten in eine Art Sammlung einfügen. Verwenden Sie dann das Entitätsframework und LINQ, um Ihre Datenbank und die Auflistung abzufragen. Ermitteln Sie, was nicht übereinstimmt, serialisieren Sie es und senden Sie es an den Webdienst in derselben Skriptkomponente.

+0

Ich habe generell etwas ambivalente Gefühle über Leute, die die ganze Arbeit für andere hier auf SO machen, aber +1 für eine sehr gründliche Antwort! Sehr hilfreich :) –

Verwandte Themen