Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamisches Festlegen des Skriptaufgabencodes in SSIS 2012

Wie Sie bemerkt haben, ist der VSTA-Hilfsmethoden die Sie 2008 verwenden konnten, wurden 2012 verschoben/entfernt. Es ist immer noch möglich, aber der Code hat sich geändert.

Am einfachsten ist es, ein vorhandenes Projekt mit zu laden VstaHelper.LoadProjectFromFolder ().

Wenn Sie Skriptdateien dynamisch hinzufügen möchten, sehen Sie sich das Snippet unten an. Es gibt zwei wichtige Dinge, die Sie beachten müssen:

Die Klassen ScriptingEngine und VstaHelper repräsentieren VSTA selbst. Hier erstellen Sie das Projekt und fügen neue Dateien hinzu. Sie können hier keine vorhandene Datei direkt entfernen oder ersetzen. Wenn Sie SaveProjecToStorage() aufrufen, ist es wie das Schließen des VSTA-Fensters … es speichert das Projekt und die kompilierte Binärdatei in der ScriptTask.

Mit ScriptTask.ScriptStorage können Sie den Inhalt der Quelldatei direkt bearbeiten. Von hier aus können Sie den Inhalt einer Datei ändern.

Das folgende Code-Snippet soll Ihnen beim Einstieg helfen.

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