2013-09-04 7 views
18

में गतिशील रूप से स्क्रिप्ट कार्य कोड सेट करें मेरे आवेदन में, एक स्क्रिप्ट कार्य गतिशील रूप से बनाया गया है।एसएसआईएस 2012

एसएसआईएस के SQL सर्वर 2008 के कार्यान्वयन में, निम्न विधि ठीक काम करती है।

private void SetSourceCode(ScriptTask scriptTask, string code, string codeName) 
    { 
     string fileName = "ScriptMain.vb"; 
     string language = "VisualBasic"; 
     string proj = ".vbproj"; 

     scriptTask.ScriptLanguage = VSTAScriptLanguages.GetDisplayName(language); 

     scriptTask.ScriptingEngine.InitNewScript(language, 
     scriptTask.ScriptProjectName, proj); 

     scriptTask.ScriptingEngine.ShowDesigner(false); 
     scriptTask.ScriptingEngine.AddCodeFile(fileName, code); 

     if (!scriptTask.ScriptingEngine.Build()) 
      throw new Exception("Failed to build vb script code: " + codeName); 
     scriptTask.ScriptingEngine.SaveScriptToStorage(); 
     if (!scriptTask.ScriptingEngine.CloseIDE(false)) 
     { 
      throw new Exception("Unable to close Scripting engine."); 
     } 
    } 

मैं एसक्यूएल सर्वर 2012 के लिए इस कोड को कैसे स्थानांतरित करूँ, क्योंकि निम्न विधियों में एसक्यूएल सर्वर से हटा दिया 2012 के dll-एस (विधानसभाओं):

  • InitNewScript
  • AddProjectReference
  • AddCodeFile
  • SaveScriptToStorage
  • Closeide
  • आम तौर पर निर्माण
  • ShowDesigner

, एसक्यूएल सर्वर 2012 में स्क्रिप्ट कार्य के लिए मैं गतिशील कैसे सेट करूँ स्रोत कोड?

+0

+1 और आपके लिए एक स्टार क्योंकि मैंने कभी ऐसा करने की कोशिश नहीं की है। मुझे जो प्रलेखन मिलता है वह [स्क्रिप्टिंगइंजिन] (http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dts.tasks.scripttask.vstataskscriptingengine.aspx) को संदर्भित करता है और कहता है "यह API SQL सर्वर का समर्थन करता है 2012 आधारभूत संरचना और इसका उद्देश्य सीधे आपके कोड से उपयोग नहीं किया जाना चाहिए "इसलिए मुझे काफी कठिन नहीं दिखना चाहिए। दयालुता है कि मेरे पास उत्पादन करने के लिए आग लगती है, यह एक मजेदार चुनौती की तरह लगता है – billinkc

+3

आपको सही दिशा में धक्का देने के लिए (क्योंकि मैंने केवल स्क्रिप्ट घटक के लिए यह किया है और स्क्रिप्ट कार्य नहीं) एसएसआईएस 2012 के लिए एक नया वीएसटीए इंटरफ़ेस है, VSTAHelper क्लास - http://tinyurl.com/vstahelper - जहां आपकी सभी विधियां चली गईं। –

उत्तर

4

जैसा कि आपने देखा है, VSTA helper methods जिसे आप 2008 में उपयोग कर सकते थे 2012 में स्थानांतरित/हटा दिए गए थे। यह अभी भी संभव है, लेकिन कोड बदल गया है।

सबसे आसान काम VstaHelper.LoadProjectFromFolder() का उपयोग कर मौजूदा प्रोजेक्ट लोड करना है।

यदि आप गतिशील रूप से स्क्रिप्ट फ़ाइलों को जोड़ना चाहते हैं, तो नीचे स्निपेट देखें। आपको ध्यान में रखने के लिए दो मुख्य चीजें हैं:

स्क्रिप्टिंगइंजिन और VstaHelper कक्षाएं VSTA स्वयं का प्रतिनिधित्व करती हैं। यह वह जगह है जहां आप प्रोजेक्ट बनाते हैं, और नई फाइलें जोड़ते हैं। आप सीधे किसी मौजूदा फ़ाइल को हटा या प्रतिस्थापित नहीं कर सकते हैं। जब आप SaveProjecToStorage() को कॉल करते हैं, तो यह VSTA विंडो को बंद करने जैसा है ... यह प्रोजेक्ट को सहेजता है और स्क्रिप्ट टास्क में बाइनरी संकलित करता है।

ScriptTask.ScriptStorage आपको सीधे स्रोत फ़ाइल सामग्री में हेरफेर करने की अनुमति देता है। यहां से, आप फ़ाइल की सामग्री को संशोधित कर सकते हैं।

निम्नलिखित कोड स्निपेट आपको प्रारंभ करने में मदद कर सकता है।

static void Main(string[] args) 
{ 
    // 1. Create new package, and add a script task 
    var pkg = new Package(); 
    var exec = pkg.Executables.Add("STOCK:ScriptTask"); 
    var th = (TaskHost)exec; 
    th.Name = "Script Task"; 
    th.Description = "This is a Script Task"; 
    var task = (ScriptTask)th.InnerObject; 

    // 2. Set the script language - "CSharp" or "VisualBasic" 
    task.ScriptLanguage = VSTAScriptLanguages.GetDisplayName("CSharp"); 

    // 3. Set any variables used by the script 
    //task.ReadWriteVariables = "User::Var1, User::Var2"; 

    // 4. Create a new project from the template located in the default path 
    task.ScriptingEngine.VstaHelper.LoadNewProject(task.ProjectTemplatePath, null, "MyScriptProject"); 

    // 5. Initialize the designer project, add a new code file, and build 
    //task.ScriptingEngine.VstaHelper.Initalize("", true); 
    //task.ScriptingEngine.VstaHelper.AddFileToProject("XX.cs", "FileContents"); 
    //task.ScriptingEngine.VstaHelper.Build(""); 

    // 6. Persist the VSTA project + binary to the task 
    if (!task.ScriptingEngine.SaveProjectToStorage()) 
    { 
     throw new Exception("Save failed"); 
    } 

    // 7. Use the following code to replace the ScriptMain contents 
    var contents = File.ReadAllText("path to file"); 
    var scriptFile = 
     task.ScriptStorage.ScriptFiles["ScriptMain.cs"] = 
     new VSTAScriptProjectStorage.VSTAScriptFile(VSTAScriptProjectStorage.Encoding.UTF8, contents); 


    // 8. Reload the script project, build and save 
    task.ScriptingEngine.LoadProjectFromStorage(); 
    task.ScriptingEngine.VstaHelper.Build(""); 

    // 9. Persist the VSTA project + binary to the task 
    if (!task.ScriptingEngine.SaveProjectToStorage()) 
    { 
     throw new Exception("Save failed"); 
    } 

    // 10. Cleanup 
    task.ScriptingEngine.DisposeVstaHelper(); 

    // 11. Save 
    string xml; 
    pkg.SaveToXML(out xml, null); 

    File.WriteAllText(@"c:\temp\package.dtsx", xml); 
} 
+0

धन्यवाद। मैं खुशी से आपको वह बक्षीस दूंगा। –