2012-07-26 13 views
10

MailChimp'ten JSON kodlu bir posta listesi çekecek bir SSIS işi kurmaya çalışıyorum, CRM veritabanımızdaki (SQL Server) bir müşteri listesiyle karşılaştırın ve zaten orada olmayan yeni müşterilerle JSON yükleyin . Bir komut dosyası görevi yazmak dışında SSIS içinde seri hale getirme/serileştirme konusunda bir şey bulamıyorum ve .Net serileştirme kitaplıklarını bir komut dosyasına aktaramıyorum. Baska öneri? Şimdiden teşekkürler! Burada eleSQL Server Entegrasyon Hizmetleri Paketi içindeki JSON verilerini ayrıştırabilir misiniz?

+1

Seri hale getirme sınıflarını neden içe aktarmıyorsunuz? Birisi bir Script Bileşeni kullanarak [bunu zaten yaptı] (http://timlaqua.com/2011/07/consuming-an-authenticated-json-feed-with-ssis/) gibi görünüyor. – Pondlife

+0

Kullanmaya çalıştığım JavaScriptSerializer sınıfını içeren System.Web.Script ad alanını almadım; Bir Komut Dosyası Görevinde (?) Hangi ithalatta yapabileceğinize dair bir sınır olduğunu varsayalım. Ancak, kaydettiğiniz bu makalede System.Runtime.Serialization.Json dosyasını içe aktarmak için bir çözüm önerilmektedir. Bu makaleyi görmüştüm ama çok hızlı okudum ve bu noktayı kaçırdım - ilgimi geri getirdiğiniz için teşekkürler. –

+0

İçe aktarma için bir sınırlama olmamalı, ancak GAC ve SQL Server SDK klasörü aracılığıyla görünmeyen hiçbir şey eklenemez. Bu ayrıca kendi özel DLL'lerinizi bir pakete nasıl ekleyeceğinizdir. – GShenanigan

cevap

17

Çift şeyler:

Birincisi, komut dosyası bileşeninde yeni kütüphaneler ekleyerek olan sorunun. SSIS gelişimini yapmak için VS 2008'i kullandığınızı ve bunu yapmak için .net 3.5 kitaplığını kullanmak istediğinizi kabul ediyorum. Projeye gidersiniz, referans ekleyin ve ihtiyacınız olan dll'leri göremezsiniz. Bu, kısmen Windows 7 ve kompakt 3.5 çerçevesini kullandığınız olabilir. .net 3.5.1 Windows 7 ile birlikte gelir, bunu etkinleştirmeniz yeterlidir. Kontrol paneline, programlara ve özelliklere gidin. Bu ekranda, Windows özelliklerini aç veya kapat, göreceksiniz. Bu pencerede Microsoft .NET Framework 3.5.1'i kontrol edin, bu şekilde çalıştırmak için birkaç dakikanızı ayırın. Bir kez bu C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v3.5 \ Profile \ Client ve C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ benzer bir dizine bakın. Çerçeve \ v3.5. Bu 2 dizin arasında, JSON'un seri hale getirilmesi/serileştirilmesi için ihtiyacınız olacak herhangi bir dll bulacaksınız. Bunlar, Project -> Add Reference -> Sekmesine Gözat'a giderek projenize eklenebilir, ardından v3.5 dizinine gidin ve ihtiyacınız olan dllleri seçin (System.Web.Extensions.dll (v3.5.30729.5446)) bu örnekte kullanılmaktadır).

Bir web hizmetinden JSON almak, seriyi kaldırmak ve verileri CRM veritabanınıza göndermek için, veri akışınızda bir komut dosyası bileşenini kaynak olarak kullanmanız ve kullanılacak tamponunuza sütun eklemeniz gerekir. JSON beslemesinden gelen verileri tutmak için (Giriş ve Çıkış ekranında). Kodda, CreateNewOutputRows yöntemini geçersiz kılmanız gerekir. İşte bunun nasıl bir örnektir:

... JSON bu benziyordu Say [{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0},{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]

Bu JSON feed özelliklerini (ve girişler üzerinde tanımlı sütunları ayna için bir sınıf tanımlamak yumruk olur ve gibi sen serisini bir kez sonuçta bu değerleri yapacak çıkışlar ekranı) ...:

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

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

Artık web hizmetini arayıp bir HttpWebRequest ve Akış kullanarak yayını, almak gerekir 210

Şimdi deserializing sonra WorkGroupMetric

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

bir diziye bizim json serisini, biz şimdi çıktı çıktı tamponuna satırlar:

İşte
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; 
     } 

tüm kod araya şeydir olur (I here aşama, örneğin bir adım olan) benzer:

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

Bu artık bir veri Desti için bir girdi olarak kullanılır ulus (CRM veritabanınız). Bir kez orada veri karşılaştırmak ve uyumsuzluklar bulmak için SQL kullanabilirsiniz, serileştirmek için verileri başka bir komut dosyası bileşenine göndermek ve geri web servisine ihtiyacınız olan güncellemeleri göndermek.

VEYA

Sen çıktı tamponuna komut bileşeninde şeyi değil çıktı verileri yapabilirsiniz. Bu durumda, JSON’u yine de deserialze etmeniz gerekir, ancak verileri bir çeşit koleksiyona koymanız gerekir. Daha sonra veritabanı ve koleksiyonunuzu sorgulamak için varlık çerçevesini ve LINQ kullanın. Neyin eşleşmediğini belirleyin, serileştirin ve bunu aynı komut dosyası bileşenindeki web hizmetine gönderin.

+0

Genelde buradaki insanlar için tüm çalışmaları yapan insanlar hakkında biraz kararsızlık duyuyorum, ama çok kapsamlı bir cevap için +1! Çok yararlı :) –