2013-09-04 17 views
18

W mojej aplikacji zadanie skryptu jest tworzone dynamicznie.Dynamiczne ustawianie skryptowego kodu zadania w SSIS 2012

W implementacji SSIS w SQL Server 2008, następująca metoda działała dobrze.

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."); 
     } 
    } 

Jak mogę przenieść ten kod do programu SQL Server 2012, ponieważ następujące metody są usuwane z SQL Server 2012 dll-S (zespoły):

  • InitNewScript
  • AddProjectReference
  • AddCodeFile
  • SaveScriptToStorage
  • CloseIDE
  • Budowanie
  • ShowDesigner

Generalnie, w jaki sposób dynamicznie ustawić kod źródłowy dla zadania skryptu w programie SQL Server 2012?

+0

+1 i gwiazda dla Ciebie, ponieważ nigdy nie próbowałem tego zrobić. Dokumentacja, którą znajduję, odnosi się do [ScriptingEngine] (http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dts.tasks.scripttask.vstataskscriptingengine.aspx) i stwierdza: "To API obsługuje SQL Server Infrastruktura 2012 roku i nie jest przeznaczona do użycia bezpośrednio z twojego kodu ", więc nie powinienem wyglądać wystarczająco mocno. Szkoda, że ​​mam do wzięcia udział w produkcji, brzmi to jak zabawne wyzwanie. – billinkc

+3

Aby skierować cię we właściwym kierunku (ponieważ zrobiłem to tylko dla komponentów skryptów, a nie zadań skryptowych), istnieje nowy interfejs VSTA dla SSIS 2012, Klasa VSTAHelper - http://tinyurl.com/vstahelper - gdzie poszły wszystkie twoje metody. –

Odpowiedz

4

Jak już zauważyłeś, w 2008 roku można było przenieść/usunąć VSTA helper methods, który można nadal używać, ale kod został zmieniony.

Najprostszym rozwiązaniem jest załadowanie istniejącego projektu za pomocą VstaHelper.LoadProjectFromFolder().

Jeśli chcesz dynamicznie dodawać pliki skryptów, zobacz poniższy fragment. Są dwie główne rzeczy, o których należy pamiętać:

Klasy ScriptingEngine i VstaHelper reprezentują samą VSTA. Tutaj możesz utworzyć projekt i dodać nowe pliki. Nie można tutaj usunąć ani zastąpić istniejącego pliku. Kiedy wywołasz SaveProjecToStorage(), to tak jakbyś zamykał okno VSTA ... zapisuje projekt i kompilował binarnie do ScriptTask.

ScriptTask.ScriptStorage pozwala bezpośrednio manipulować zawartością pliku źródłowego. Stąd możesz modyfikować zawartość pliku.

Poniższy fragment kodu powinien pomóc w rozpoczęciu pracy.

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

Dziękuję. Z chęcią dam ci tę nagrodę. –

Powiązane problemy