Sto provando a impostare un processo SSIS che estrarrà una mailing list con codifica JSON da MailChimp, la confronta con un elenco di clienti nel nostro database CRM (SQL Server) e carica tramite JSON eventuali nuovi clienti non già lì . Non riesco a trovare nulla sulla serializzazione/deserializzazione di JSON all'interno di SSIS, oltre alla scrittura di un'attività di script, e sembra che non sia possibile importare le librerie di serializzazione .Net in uno script. Eventuali suggerimenti? Grazie in anticipo!Analizzare i dati JSON all'interno del pacchetto SQL Server Integration Services?
risposta
cose Coppia per affrontare qui:
primo luogo, il problema con l'aggiunta di nuove librerie nel componente di scripting. Presumo che tu stia utilizzando VS 2008 per eseguire lo sviluppo di SSIS e che desideri utilizzare la libreria .net 3.5 per farlo. Vai al progetto, aggiungi riferimento e non vedi nessuna delle dll di cui hai bisogno. Questo potrebbe essere in parte il fatto che stai usando Windows 7 e il framework compatto 3.5. .net 3.5.1 viene fornito con Windows 7, devi solo abilitarlo. Vai a pannello di controllo, programmi e funzionalità. In quella schermata vedrai Attivare o disattivare le funzionalità di Windows, fai clic su di esso. In questa finestra controlla Microsoft .NET Framework 3.5.1, in questo modo sono necessari alcuni minuti per l'esecuzione. Al termine, cercare una directory simile a questi C: \ Programmi (x86) \ Assiemi di riferimento \ Microsoft \ Framework.NETFramework \ v3.5 \ Profile \ Client e C: \ Programmi (x86) \ Assiemi di riferimento \ Microsoft \ Framework \ v3.5. Tra queste 2 directory, troverai qualsiasi dll di cui avrai bisogno per la serializzazione/deserializzazione di JSON. Questi possono essere aggiunti al progetto andando a Progetto -> Aggiungi riferimento -> Sfoglia scheda, quindi accedere alla directory v3.5 e selezionare le DLL necessarie (System.Web.Extensions.dll (v3.5.30729.5446) è usato in questo esempio).
Per ottenere JSON da un servizio Web, deserializzare e inviare i dati al database CRM, sarà necessario utilizzare un componente di script come origine nel flusso di dati e aggiungere colonne al buffer di output che verrà utilizzato per contenere i dati provenienti dal feed JSON (nella schermata Input e Output). Nel codice, dovrai eseguire l'override del metodo CreateNewOutputRows. Ecco un esempio di come fare questo:
dire la vostra JSON si presentava così ... [{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0},{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]
avrei pugno definire una classe di rispecchiare questo gli attributi dei feed JSON (e le colonne definite sugli ingressi e schermo uscite) che finirà per tenere questi valori una volta che si deserializzare ... come tale:
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; }
}
Ora è necessario chiamare il servizio web e ottenere il feed JSON utilizzando un HttpWebRequest e un flusso:
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();
}
Ora deserializzare nostro JSON in un array di WorkGroupMetric
JavaScriptSerializer sr = new JavaScriptSerializer();
WorkGroupMetric[] jsonResponse = sr.Deserialize<WorkGroupMetric[]>(jsonString);
Dopo deserializzazione, possiamo ora uscita le righe per il buffer di uscita:
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;
}
Ecco cosa tutto il codice messo insieme sarebbe sembrano (ho un passo dopo passo esempio here):
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; }
}
Questo può ora essere utilizzato come un ingresso per un desti dati nazione (il tuo database CRM). Una volta lì, è possibile utilizzare SQL per confrontare i dati e trovare disallineamenti, inviare i dati a un altro componente di script per serializzare e inviare eventuali aggiornamenti necessari al servizio web.
O
si può fare tutto nella componente di script e dati non in uscita al buffer di output. In questa situazione avresti ancora bisogno di deserializzare il JSON, ma inserire i dati in una sorta di raccolta. Quindi utilizzare l'entity framework e LINQ per interrogare il database e la raccolta. Determinare ciò che non corrisponde, serializzarlo e inviarlo al servizio Web nello stesso componente di script.
In generale ho sentimenti un po 'ambivalenti su chi fa tutto il lavoro per gli altri qui su SO, ma +1 per una risposta molto completa! Molto utile :) –
- 1. Sql server Integration Services Compatibilità 2008-2005
- 2. SQL Server 2012 Integration Services non è riuscito durante la connessione tramite SSMS
- 3. SQL Server Reporting Services per Amazon RDS
- 4. Come visualizzare i checkbox in SQL Server Reporting Services?
- 5. ASP.NET MVC e SQL Server Reporting Services
- 6. Come ottenere i dati del risultato della query SQL Server in formato JSON?
- 7. Analizzare i dati JSON utilizzando JSONReader o JSONObject/JSONArray
- 8. Ottieni i dati del server Sql usando smo
- 9. Inserire i dati in vista (SQL Server)
- 10. Sql Server Reporting Services vs Reporting tramite applicazione .NET
- 11. Come esportare i dati da SQL Server?
- 12. Come analizzare i dati JSONP restituiti dal server remoto
- 13. CS2001 AssemblyAttributes.cs mancante durante l'esecuzione del pacchetto SSIS distribuito sul server
- 14. Sottoscrizione di SQL Server Reporting Services con parametri dinamici
- 15. Genera report da URL - SQL Server Reporting Services 2008
- 16. L'Ottimizzazione guidata database di SQL Server modifica i dati?
- 17. SQL Server table to json
- 18. Come utilizzare MySQL come origine dati in Microsoft SQL Server Analysis Services?
- 19. Come utilizzare WebService di SQL Server 2008 Reporting Services
- 20. SQL Server 2012
- 21. Crystal Reports e Microsoft SQL Server Reporting Services
- 22. SQL Server 2005 Reporting Services - Pro e Contro
- 23. Rendere SQL Server Reporting Services utilizzare le misure di metrica
- 24. SQL Server Reporting Services 2008 R2 - Protezione cartella e report
- 25. node.js analizzare JSON di richiesta
- 26. Come installare SQL Server Reporting Services (SSRS) su un'installazione esistente di SQL Server Express?
- 27. SQL Server 2012 Reporting Services installazione errore Catalogo
- 28. jQuery non sembra analizzare JSON automaticamente
- 29. dati da SQL Server per elasticsearch Nodo
- 30. Il client SQL SQuirreL non mostra i dati Json
Perché non è possibile importare le classi di serializzazione? Qualcuno sembra averlo già fatto (http://timlaqua.com/2011/07/consuming-an-authenticated-json-feed-with-ssis/) usando un componente Script. – Pondlife
Non è stato possibile importare lo spazio dei nomi System.Web.Script che contiene la classe JavaScriptSerializer che stavo tentando di utilizzare; Presumo che ci sia un limite a ciò che le importazioni si possono fare in una Script Task (?). Tuttavia, l'articolo che hai notato offre una soluzione a questo, che è di importare System.Runtime.Serialization.Json. Avevo visto quell'articolo ma lo leggevo troppo in fretta e mi mancava quel punto, grazie per averlo riportato alla mia attenzione. –
Non ci dovrebbe essere un limite alle importazioni, ma tutto ciò che non viene visualizzato può essere aggiunto tramite GAC e la cartella SDK di SQL Server. Questo è anche il modo in cui aggiungere le DLL personalizzate a un pacchetto. – GShenanigan