12

JSON でエンコードされたメーリング リストを MailChimp から取得し、それを CRM データベース (SQL Server) の顧客リストと比較し、まだ存在しない新しい顧客を JSON 経由でアップロードする SSIS ジョブをセットアップしようとしています。スクリプト タスクを作成する以外に、SSIS 内で JSON をシリアル化/逆シリアル化する方法が見つからないようで、.Net シリアル化ライブラリをスクリプトにインポートできないようです。助言がありますか?前もって感謝します!

4

1 に答える 1

18

ここで対処するいくつかの事柄:

まず、スクリプト コンポーネントに新しいライブラリを追加する際の問題です。VS 2008 を使用して SSIS 開発を行っており、これを行うために .net 3.5 ライブラリを使用したいと考えています。プロジェクトに移動して参照を追加すると、必要な dll が表示されません。これは、Windows 7 とコンパクト 3.5 フレームワークを使用していることが原因の一部である可能性があります。.net 3.5.1 は Windows 7 に付属しているため、有効にするだけです。コントロール パネル、プログラム、および機能に移動します。その画面で、Turn Windows features on or off と表示され、それをクリックします。そのウィンドウで、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\ のようなディレクトリを探します。フレームワーク\v3.5. これら 2 つのディレクトリの間に、JSON のシリアル化/逆シリアル化に必要な dll があります。これらをプロジェクトに追加するには、[プロジェクト] --> [参照の追加] --> [参照] タブに移動し、v3.5 ディレクトリに移動して、必要な dll (System.Web.Extensions.dll(v3.5.30729.5446) ) がこの例で使用されています)。

Web サービスから 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 フィード属性 (および入力画面と出力画面で定義した列) をミラーリングするクラスを最初に定義し、逆シリアル化すると最終的にこれらの値を保持します。

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 と Stream を使用して 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();
            }

次に、json を WorkGroupMetric の配列に逆シリアル化します。

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

逆シリアル化後、行を出力バッファーに出力できるようになりました。

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

まとめたすべてのコードは次のようになります (ここに段階的な例があります)。

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

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

また

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

于 2013-05-21T16:36:46.330 に答える