2012-07-26 9 views
10

मैं एक एसएसआईएस नौकरी स्थापित करने की कोशिश कर रहा हूं जो मेलचंप से जेएसओएन-एन्कोडेड मेलिंग सूची खींच लेगा, इसकी तुलना हमारे सीआरएम डेटाबेस (एसक्यूएल सर्वर) में ग्राहकों की एक सूची में करें, और जेएसओएन के माध्यम से अपलोड करें जो पहले से मौजूद नहीं है । मुझे स्क्रिप्ट कार्य लिखने के अलावा एसएसआईएस के भीतर जेएसओएन को क्रमबद्ध/deserializing पर कुछ भी नहीं मिल रहा है, और ऐसा लगता है कि मैं .NET serialization पुस्तकालयों को एक स्क्रिप्ट में आयात नहीं कर सकता। कोई सुझाव? अग्रिम में धन्यवाद!SQL सर्वर एकीकरण सेवा पैकेज के भीतर पार्स JSON डेटा?

+1

आप धारावाहिक कक्षाओं को आयात क्यों नहीं कर सकते? ऐसा लगता है कि किसी ने स्क्रिप्ट घटक का उपयोग करके ऐसा किया है [http://timlaqua.com/2011/07/consuming-an-authenticated-json-feed-with-ssis/)। – Pondlife

+0

मैं System.Web.Script नामस्थान आयात नहीं कर सका जिसमें जावास्क्रिप्टसेरियलाइज़र क्लास I का उपयोग करने का प्रयास कर रहा था; मुझे लगता है कि आप स्क्रिप्ट कार्य (?) में क्या आयात कर सकते हैं इस पर कुछ सीमा है। हालांकि, आपके द्वारा नोट किया गया आलेख इस के लिए एक समाधान प्रदान करता है, जो सिस्टम आयात करना है। रनटाइम। Serialization.Json। मैंने उस लेख को देखा था लेकिन इसके माध्यम से बहुत तेज़ पढ़ा और उस बिंदु को याद किया - इसे मेरे ध्यान में वापस लाने के लिए धन्यवाद। –

+0

आयात की सीमा नहीं होनी चाहिए, लेकिन जो कुछ भी प्रदर्शित नहीं होता है उसे जीएसी और एसक्यूएल सर्वर एसडीके फ़ोल्डर के माध्यम से जोड़ा जा सकता है। यह भी है कि आप पैकेज में अपने स्वयं के कस्टम डीएलएल कैसे जोड़ देंगे। – GShenanigan

उत्तर

17

युगल चीज़ें यहाँ संबोधित करने के लिए:

पहले, पटकथा घटक में नए पुस्तकालयों को जोड़ने के साथ आपकी समस्या। मुझे लगता है कि आप अपने एसएसआईएस विकास करने के लिए वीएस 2008 का उपयोग कर रहे हैं और ऐसा करने के लिए .NET 3.5 लाइब्रेरी का उपयोग करना चाहते हैं। आप प्रोजेक्ट पर जाते हैं, संदर्भ जोड़ते हैं और आपको किसी भी डीएल की आवश्यकता नहीं होती है। यह कुछ हद तक हो सकता है कि आप विंडोज 7 और कॉम्पैक्ट 3.5 फ्रेमवर्क का उपयोग कर रहे हैं। .NET 3.5.1 विंडोज 7 के साथ आता है, आपको बस इसे सक्षम करना होगा। नियंत्रण कक्ष, कार्यक्रम और सुविधाओं पर जाएं। उस स्क्रीन में आप टर्न विंडोज फीचर्स को चालू या बंद देखेंगे, उस पर क्लिक करें। उस विंडो में माइक्रोसॉफ्ट .NET Framework 3.5.1 की जांच करें, इस तरह चलाने के लिए कुछ मिनट लगें। एक बार यह खत्म हो जाने के बाद इन सी: \ प्रोग्राम फ़ाइलें (x86) \ संदर्भ असेंबली \ Microsoft \ Framework.NETFramework \ v3.5 \ प्रोफ़ाइल \ क्लाइंट और सी: \ प्रोग्राम फ़ाइलें (x86) \ संदर्भ असेंबली \ Microsoft \ फ्रेमवर्क \ v3.5। इन 2 निर्देशिकाओं के बीच, आपको जेएसओएन के क्रमिकरण/deserializtion के लिए किसी भी डीएलएल की आवश्यकता होगी। प्रोजेक्ट पर जाकर इन्हें आपके प्रोजेक्ट में जोड़ा जा सकता है -> संदर्भ जोड़ें -> टैब ब्राउज़ करें, फिर v3.5 निर्देशिका पर नेविगेट करें और आपको आवश्यक डीएल चुनें (System.Web.Extensions.dll (v3.5.30729.5446) इस उदाहरण में प्रयोग किया जाता है)।

किसी वेब सेवा से JSON प्राप्त करने के लिए, इसे deserialize, और डेटा को अपने सीआरएम डेटाबेस में भेजने के लिए, आपको अपने डेटा प्रवाह में एक स्रोत के रूप में एक स्क्रिप्ट घटक का उपयोग करना होगा और आपके आउटपुट बफर में कॉलम जोड़ना होगा JSON फ़ीड (इनपुट और आउटपुट स्क्रीन पर) से आने वाले डेटा को पकड़ने के लिए। कोड में, आपको CreateNewOutputRows विधि को ओवरराइड करने की आवश्यकता होगी। यहां ऐसा करने का एक उदाहरण है:

कहो आपका JSON इस तरह देखा ... [{"CN":"ALL","IN":"Test1","CO":0,"CA":0,"AB":0},{"CN":"ALL","IN":"Test2","CO":1,"CA":1,"AB":0}]

मैं इस JSON फ़ीड विशेषताएं (और कॉलम आप इनपुट पर परिभाषित दर्पण एक वर्ग को परिभाषित मुट्ठी होता है और आउटपुट स्क्रीन) है कि अंततः इन मूल्यों का आयोजन करेगा एक बार आप deserialize ... जैसे:

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; } 
} 

अब आप अपने वेब सेवा को कॉल और एक HttpWebRequest और एक स्ट्रीम का उपयोग कर JSON फ़ीड प्राप्त करने की आवश्यकता 210

अब हम WorkGroupMetric

JavaScriptSerializer sr = new JavaScriptSerializer(); 
WorkGroupMetric[] jsonResponse = sr.Deserialize<WorkGroupMetric[]>(jsonString); 

की एक सरणी deserializing बाद में हमारे json deserialize, हम कर सकते हैं अब उत्पादन उत्पादन बफर के लिए पंक्तियों:

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; 
     } 

यहाँ सभी कोड को एक साथ रखा है होगा की तरह (मैं कदम उदाहरण के द्वारा एक कदम है 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; } 
} 

यह अब एक डेटा desti के लिए एक इनपुट के रूप में इस्तेमाल किया जा सकता है राष्ट्र (आपका सीआरएम डेटाबेस)। एक बार जब आप डेटा की तुलना करने और विसंगतियों को ढूंढने के लिए एसक्यूएल का उपयोग कर सकते हैं, तो डेटा को क्रमबद्ध करने के लिए डेटा को किसी अन्य स्क्रिप्ट घटक पर भेजें, और वेब सेवा पर आपको जो भी अपडेट चाहिए उसे भेजें।

या

आप उत्पादन बफर करने के लिए स्क्रिप्ट घटक में सब कुछ और नहीं आउटपुट डेटा कर सकते हैं। इस स्थिति में आपको अभी भी JSON को deserialze करने की आवश्यकता होगी, लेकिन डेटा को किसी प्रकार के संग्रह में डाल दें। फिर अपने डेटाबेस और संग्रह से पूछने के लिए इकाई ढांचे और LINQ का उपयोग करें। यह निर्धारित करें कि मेल नहीं खाता है, इसे क्रमबद्ध करें, और उसी स्क्रिप्ट घटक में वेब सेवा को भेजें।

+0

मेरे पास आम तौर पर एसओ पर दूसरों के लिए सभी काम करने वाले लोगों के बारे में कुछ हद तक आक्रामक भावनाएं हैं, लेकिन बहुत ही सही जवाब के लिए +1! बहुत उपयोगी :) –

संबंधित मुद्दे