MailChimp'ten JSON kodlu bir posta listesi çekecek bir SSIS işi kurmaya çalışıyorum, CRM veritabanımızdaki (SQL Server) bir müşteri listesiyle karşılaştırın ve zaten orada olmayan yeni müşterilerle JSON yükleyin . Bir komut dosyası görevi yazmak dışında SSIS içinde seri hale getirme/serileştirme konusunda bir şey bulamıyorum ve .Net serileştirme kitaplıklarını bir komut dosyasına aktaramıyorum. Baska öneri? Şimdiden teşekkürler! Burada eleSQL Server Entegrasyon Hizmetleri Paketi içindeki JSON verilerini ayrıştırabilir misiniz?
cevap
Çift şeyler:
Birincisi, komut dosyası bileşeninde yeni kütüphaneler ekleyerek olan sorunun. SSIS gelişimini yapmak için VS 2008'i kullandığınızı ve bunu yapmak için .net 3.5 kitaplığını kullanmak istediğinizi kabul ediyorum. Projeye gidersiniz, referans ekleyin ve ihtiyacınız olan dll'leri göremezsiniz. Bu, kısmen Windows 7 ve kompakt 3.5 çerçevesini kullandığınız olabilir. .net 3.5.1 Windows 7 ile birlikte gelir, bunu etkinleştirmeniz yeterlidir. Kontrol paneline, programlara ve özelliklere gidin. Bu ekranda, Windows özelliklerini aç veya kapat, göreceksiniz. Bu pencerede Microsoft .NET Framework 3.5.1'i kontrol edin, bu şekilde çalıştırmak için birkaç dakikanızı ayırın. Bir kez bu C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v3.5 \ Profile \ Client ve C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ benzer bir dizine bakın. Çerçeve \ v3.5. Bu 2 dizin arasında, JSON'un seri hale getirilmesi/serileştirilmesi için ihtiyacınız olacak herhangi bir dll bulacaksınız. Bunlar, Project -> Add Reference -> Sekmesine Gözat'a giderek projenize eklenebilir, ardından v3.5 dizinine gidin ve ihtiyacınız olan dllleri seçin (System.Web.Extensions.dll (v3.5.30729.5446)) bu örnekte kullanılmaktadır).
Bir web hizmetinden JSON almak, seriyi kaldırmak ve verileri CRM veritabanınıza göndermek için, veri akışınızda bir komut dosyası bileşenini kaynak olarak kullanmanız ve kullanılacak tamponunuza sütun eklemeniz gerekir. JSON beslemesinden gelen verileri tutmak için (Giriş ve Çıkış ekranında). Kodda, CreateNewOutputRows yöntemini geçersiz kılmanız gerekir. İşte bunun nasıl bir örnektir:
... JSON bu benziyordu Say [{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0},{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]
Bu JSON feed özelliklerini (ve girişler üzerinde tanımlı sütunları ayna için bir sınıf tanımlamak yumruk olur ve gibi sen serisini bir kez sonuçta bu değerleri yapacak çıkışlar ekranı) ...:
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();
}
:
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; }
}
Artık web hizmetini arayıp bir HttpWebRequest ve Akış kullanarak yayını, almak gerekir 210
Şimdi deserializing sonra WorkGroupMetric
JavaScriptSerializer sr = new JavaScriptSerializer();
WorkGroupMetric[] jsonResponse = sr.Deserialize<WorkGroupMetric[]>(jsonString);
bir diziye bizim json serisini, biz şimdi çıktı çıktı tamponuna satırlar:
İşteforeach (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;
}
tüm kod araya şeydir olur (I here aşama, örneğin bir adım olan) benzer:
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; }
}
Bu artık bir veri Desti için bir girdi olarak kullanılır ulus (CRM veritabanınız). Bir kez orada veri karşılaştırmak ve uyumsuzluklar bulmak için SQL kullanabilirsiniz, serileştirmek için verileri başka bir komut dosyası bileşenine göndermek ve geri web servisine ihtiyacınız olan güncellemeleri göndermek.
VEYA
Sen çıktı tamponuna komut bileşeninde şeyi değil çıktı verileri yapabilirsiniz. Bu durumda, JSON’u yine de deserialze etmeniz gerekir, ancak verileri bir çeşit koleksiyona koymanız gerekir. Daha sonra veritabanı ve koleksiyonunuzu sorgulamak için varlık çerçevesini ve LINQ kullanın. Neyin eşleşmediğini belirleyin, serileştirin ve bunu aynı komut dosyası bileşenindeki web hizmetine gönderin.Genelde buradaki insanlar için tüm çalışmaları yapan insanlar hakkında biraz kararsızlık duyuyorum, ama çok kapsamlı bir cevap için +1! Çok yararlı :) –
- 1. SQL Server Raporlama Hizmetleri nedir?
- 2. İçindeki SQL Server 2000
- 3. Spark SQL: Json verilerini DataFrame
- 4. ASP.NET MVC & SQL Server Raporlama Hizmetleri
- 5. Json verilerini json verileriyle nasıl yüklerim?
- 6. SQL Server 2012
- 7. SQL Server OPENJSON yuvalanmış json oku
- 8. Azure SQL Server güvenlik
- 9. Entegrasyon Hizmetlerinde bir paketi el ile nasıl başarısız edebilirim?
- 10. Microsoft SQL Server 2012
- 11. SSIS 2012 Hatası Entegrasyon Hizmetlerine bağlanılamıyor
- 12. [SQL Server]
- 13. SQL Server - CREATE TABLE alanında alan açıklamaları ekleyebilir misiniz?
- 14. mümkün SQL Server SSIS 2012 paketi dağıtmak için mi 2008
- 15. JSON verilerini nasıl desiteleyebilirim?
- 16. JSONPlaceholder'dan JSON verilerini Angular
- 17. JSON verilerini swift2.0, xcode7.3
- 18. Test istemci verilerini JSON
- 19. Json verilerini extJS
- 20. Yay Web Hizmetleri ve Json
- 21. Sql Server ve Mysql Server arasında eşitleme
- 22. SQL Server, bir 'durum'
- 23. Nesne içindeki JSON dizisini bölme
- 24. SQL Server
- 25. Sql Server
- 26. SQL Server
- 27. SQL Server
- 28. SQL Server
- 29. SQL Server
- 30. SQL Server
Seri hale getirme sınıflarını neden içe aktarmıyorsunuz? Birisi bir Script Bileşeni kullanarak [bunu zaten yaptı] (http://timlaqua.com/2011/07/consuming-an-authenticated-json-feed-with-ssis/) gibi görünüyor. – Pondlife
Kullanmaya çalıştığım JavaScriptSerializer sınıfını içeren System.Web.Script ad alanını almadım; Bir Komut Dosyası Görevinde (?) Hangi ithalatta yapabileceğinize dair bir sınır olduğunu varsayalım. Ancak, kaydettiğiniz bu makalede System.Runtime.Serialization.Json dosyasını içe aktarmak için bir çözüm önerilmektedir. Bu makaleyi görmüştüm ama çok hızlı okudum ve bu noktayı kaçırdım - ilgimi geri getirdiğiniz için teşekkürler. –
İçe aktarma için bir sınırlama olmamalı, ancak GAC ve SQL Server SDK klasörü aracılığıyla görünmeyen hiçbir şey eklenemez. Bu ayrıca kendi özel DLL'lerinizi bir pakete nasıl ekleyeceğinizdir. – GShenanigan