JSON でエンコードされたメーリング リストを MailChimp から取得し、それを CRM データベース (SQL Server) の顧客リストと比較し、まだ存在しない新しい顧客を JSON 経由でアップロードする SSIS ジョブをセットアップしようとしています。スクリプト タスクを作成する以外に、SSIS 内で JSON をシリアル化/逆シリアル化する方法が見つからないようで、.Net シリアル化ライブラリをスクリプトにインポートできないようです。助言がありますか?前もって感謝します!
1 に答える
ここで対処するいくつかの事柄:
まず、スクリプト コンポーネントに新しいライブラリを追加する際の問題です。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 サービスに送信します。