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