Я пытаюсь настроить SSIS-задание, которое вытащит JSON-кодированный список рассылки из MailChimp, сравните его со списком клиентов в нашей базе данных CRM (SQL Server) и загрузите через JSON новых клиентов там. Кажется, я ничего не могу найти при сериализации/десериализации JSON в SSIS, кроме написания задачи script, и кажется, что я не могу импортировать библиотеки сериализации .Net в script. Какие-либо предложения? Спасибо заранее!
Разбирать данные JSON в пакете услуг интеграции SQL Server?
Ответ 1
Пара вещей, чтобы обратиться сюда:
Во-первых, ваша проблема с добавлением новых библиотек в компонент сценариев. Я предполагаю, что вы используете VS 2008 для разработки своей SSIS и хотите использовать библиотеку .net 3.5 для этого. Вы идете в проект, добавляете ссылку, и вы не видите ни одной из DLL, в которой вы нуждаетесь. Это может быть отчасти тем, что вы используете окна 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\Framework\v3.5. Между этими двумя каталогами вы найдете любую DLL, необходимую для сериализации/десериализации JSON. Они могут быть добавлены в ваш проект, перейдя в Project → Add Reference → Browse Tab, затем перейдите в каталог v3.5 и выберите нужные вам библиотеки (System.Web.Extensions.dll(v3.5.30729.5446). ) используется в этом примере).
Чтобы получить JSON из веб-службы, десериализовать его и отправить данные в вашу базу данных CRM, вам нужно будет использовать компонент script в качестве источника в потоке данных и добавить столбцы в выходной буфер, который будет используется для хранения данных, поступающих из канала 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; }
}
Теперь вам нужно позвонить в свою веб-службу и получить канал JSON с помощью HttpWebRequest и потока:
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 для сравнения данных и поиска несоответствий, отправки данных в другой компонент script для сериализации и отправки любых обновлений, которые вам нужны обратно в веб-службу.
ИЛИ
Вы можете сделать все в компоненте script, а не выводить данные в выходной буфер. В этой ситуации вам все равно придется десериализовать JSON, но поместите данные в какую-то коллекцию. Затем используйте инфраструктуру сущности и LINQ для запроса вашей базы данных и коллекции. Определите, что не соответствует, не сериализуйте его и отправьте в веб-службу в том же компоненте script.