关于 c#:在 SSIS 2012 中动态设置脚本任务代码

Set Script Task code dynamically in SSIS 2012

在我的应用程序中,动态创建了一个脚本任务。

在 SQL Server 2008 的 SSIS 实现中,以下方法运行良好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    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,因为从 SQL Server 2012 dll-s(程序集)中删除了以下方法:

  • 初始化新脚本
  • 添加项目参考
  • 添加代码文件
  • 保存脚本到存储
  • 关闭IDE
  • 建造
  • 秀设计师

一般情况下,如何在 SQL Server 2012 中动态设置脚本任务的源代码?


正如您所注意到的,您可以在 2008 年使用的 VSTA 辅助方法已在 2012 年移动/删除。仍然可以这样做,但代码已更改。

最简单的方法是使用 VstaHelper.LoadProjectFromFolder().

加载现有项目

如果您想动态添加脚本文件,请参阅下面的代码段。您需要记住两个主要事项:

ScriptingEngine 和 VstaHelper 类代表 VSTA 本身。这是您创建项目和添加新文件的地方。您不能在此处直接删除或替换现有文件。当您调用 SaveProjecToStorage() 时,就像关闭 VSTA 窗口一样 a€|它将项目和编译后的二进制文件保存到 ScriptTask。

ScriptTask.ScriptStorage 允许您直接操作源文件内容。从这里,您可以修改文件的内容。

以下代码片段应该可以帮助您入门。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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);
}