2012-07-26 8 views
10

私は、MailChimpからJSONでエンコードされたメーリングリストを取得し、CRMデータベース(SQL Server)の顧客のリストと比較し、そこにない新規顧客をJSON経由でアップロードするSSISジョブを設定しようとしています。スクリプトタスクを書く以外に、SSIS内でJSONをシリアライズ/デシリアライズすることができないようで、.Netシリアルライブラリをスクリプトにインポートできないようです。助言がありますか?前もって感謝します!ここに対処するためのSQL Server Integration Servicesパッケージ内のJSONデータを解析しますか?

+1

シリアル化クラスをインポートできないのはなぜですか? Script Componentを使用している人がいるようです(http://timlaqua.com/2011/07/consuming-an-authenticated-json-feed-with-ssis/)。 – Pondlife

+0

使用しようとしていたJavaScriptSerializerクラスを含むSystem.Web.Script名前空間をインポートできませんでした。私は、あなたがスクリプトタスク(?)にどのようなインポートをすることができるかにある程度制限があると仮定します。しかし、この記事では、System.Runtime.Serialization.Jsonをインポートするためのソリューションを提供しています。私はその記事を見ていましたが、それをあまりにも速く読んで、その点を逃しました - それを私の注意に戻してくれてありがとう。 –

+0

インポートには制限はないはずですが、表示されないものはGACとSQL Server SDKフォルダから追加できます。また、独自のカスタムDLLをパッケージに追加する方法もあります。 – GShenanigan

答えて

17

カップルの事:

まず、スクリプトコンポーネントに新しいライブラリを追加して、あなたの問題。私はあなたのSSIS開発を行うためにVS 2008を使用していると仮定し、これを行うには、ネット3.5ライブラリを使用したい。プロジェクトに行って参照を追加すると、必要なdllが表示されません。これは、Windows 7とコンパクトな3.5フレームワークを使用していることが一部にある可能性があります。 .net 3.5.1にはWindows 7が付属しています。有効にする必要があります。コントロールパネル、プログラム、および機能に移動します。その画面では、Windowsの機能をオンまたはオフにして、それをクリックします。そのウィンドウで、Microsoft .NET Framework 3.5.1をチェックします。この方法では、実行に数分かかります。 C:¥Program Files(x86)¥Reference Assemblies¥Microsoft¥Framework.NETFramework¥v3.5¥Profile¥ClientおよびC:¥Program Files(x86)¥Reference Assemblies¥Microsoft¥Windowsのようなディレクトリを探します。フレームワーク\ v3.5。これらの2つのディレクトリの間には、JSONのシリアル化/デシリアライズに必要なdllがあります。これらをプロジェクトに追加するには、Project - > Add Reference - > Browseタブを選択し、v3.5ディレクトリに移動して必要なDLLを選択します(System.Web.Extensions.dll(v3.5.30729.5446) )がこの例で使用される)。

ウェブサービスからJSONを取得してデシリアライズしてCRMデータベースに送信するには、データフローのスクリプトコンポーネントをソースとして使用し、使用する出力バッファにカラムを追加する必要がありますJSONフィードからのデータを保持します(入力画面と出力画面)。コードでは、CreateNewOutputRowsメソッドをオーバーライドする必要があります。ここでこれを行う方法の例は次のとおりです。

は...あなたのJSONはこのように見えたと言う[{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0},{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]

私は、このJSONフィードの属性(とあなたが入力に定義された列をミラーリングするクラスを定義拳なり、など、あなたがデシリアライズ後に最終的にこれらの値を保持する出力画面)...:

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

は今、あなたは、あなたのWebサービスを呼び出し、HttpWebRequestのとストリームを使用してJSONフィードを取得する必要があります210

は、今、私たちはデシリアライズ後WorkGroupMetric

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

の配列に私たちのJSONをデシリアライズ、我々は今、出力、出力バッファに行することができます:ここで

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

は、すべてのコードが一緒に考え置くものです(私は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; } 
} 

これは、現在のデータdestiのための入力として使用することができます国(あなたのCRMデータベース)。 SQLを使用してデータを比較し、不一致を見つけたら、別のスクリプトコンポーネントにデータを送信してシリアル化し、必要な更新をWebサービスに送り返します。

OR

あなたは、出力バッファに出力データをスクリプトコンポーネントに全力を尽くすとすることはできません。このような状況では、JSONを逆シリアル化する必要がありますが、データを何らかのコレクションに入れる必要があります。エンティティフレームワークとLINQを使用して、データベースとコレクションを照会します。一致しないものを判別し、シリアル化し、同じスクリプトコンポーネントのWebサービスに送信します。

+0

私は一般的に、ここで他の人のためにすべての仕事をしている人については多少の相反する感情を持っていますが、非常に徹底的な答えは+1です!非常に役立ちます :) –

関連する問題