Подтвердить что ты не робот

Задайте Script код задачи динамически в SSIS 2012

В моем приложении задача script создается динамически.

В SQL Server 2008 реализация SSIS, следующий метод работал нормально.

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

Как перенести этот код на SQL Server 2012, потому что следующие методы удалены из dll-s (сборки) SQL Server 2012:

  • InitNewScript
  • AddProjectReference
  • AddCodeFile
  • SaveScriptToStorage
  • CloseIDE
  • Построить
  • ShowDesigner

Как я могу динамически установить исходный код для задачи script в SQL Server 2012?

4b9b3361

Ответ 1

Как вы заметили, методы VSTA helper, которые вы могли бы использовать в 2008 году, были перемещены/удалены в 2012 году. До сих пор можно сделать, но код изменился.

Самый простой способ - загрузить существующий проект, используя VstaHelper.LoadProjectFromFolder().

Если вы хотите динамически добавлять файлы script, см. фрагмент ниже. Вам нужно иметь в виду две основные вещи:

Классы ScriptingEngine и VstaHelper представляют собой VSTA. Здесь вы создаете проект и добавляете новые файлы. Вы не можете удалить или заменить существующий файл прямо здесь. Когда вы вызываете SaveProjecToStorage(), это похоже на закрытие окна VSTA... он сохраняет проект и скомпилирует двоичный файл ScriptTask.

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