web-dev-qa-db-ja.com

SQL Server Integration Servicesパッケージ内のJSONデータを解析しますか?

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

11
Craig Saboe

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

まず、スクリプトコンポーネントに新しいライブラリを追加する際の問題。 SSIS開発を行うためにVS2008を使用していて、これを行うために.net3.5ライブラリを使用したいとします。プロジェクトに移動し、参照を追加しましたが、必要なdllが表示されません。これは、Windows7とコンパクト3.5フレームワークを使用していることが一因かもしれません。 .net3.5.1にはWindows7が付属しており、有効にする必要があります。コントロールパネル、プログラム、機能に移動します。その画面で、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 \に類似したディレクトリを探します。フレームワーク\ 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サービスに送り返すことができます。

OR

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

17
jymbo