Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Imposta il codice dell'attività script in modo dinamico in SSIS 2012

Come avrai notato, il Metodi di supporto VSTA che potresti utilizzare nel 2008 sono stati spostati/rimossi nel 2012. È ancora possibile farlo, ma il codice è cambiato.

La cosa più semplice da fare è caricare un progetto esistente utilizzando VstaHelper.LoadProjectFromFolder ().

Se desideri aggiungere file di script in modo dinamico, consulta lo snippet di seguito. Ci sono due cose principali che devi tenere a mente:

Le classi ScriptingEngine e VstaHelper rappresentano VSTA stesso. Qui è dove crei il progetto e aggiungi nuovi file. Non è possibile rimuovere o sostituire un file esistente direttamente qui. Quando chiami SaveProjecToStorage(), è come chiudere la finestra VSTA... salva il progetto e il binario compilato in ScriptTask.

ScriptTask.ScriptStorage consente di manipolare direttamente il contenuto del file di origine. Da qui puoi modificare il contenuto di un file.

Il seguente frammento di codice dovrebbe aiutarti a iniziare.

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