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