【问题标题】:Executing DTSX file (SSIS package) remotely and capturing events远程执行 DTSX 文件(SSIS 包)并捕获事件
【发布时间】:2012-10-15 18:12:44
【问题描述】:

我正在浏览我们拥有的一个简单应用程序,并正在尝试对其进行一些更改/改进。目前,我们的应用程序在远程计算机上运行一个 bat 文件,该文件又执行 DTSX 文件。效果很好。

我希望能够从 bat/dtsx 文件中捕获事件/输出。我找到了this,但由于我没有直接通过代码运行 DTSX 文件,我不确定这是否适用于此。我对运行 DTSX/SSIS 包知之甚少,所以我什至不确定从哪里开始。

还应注意,这是在 VB.NET 中完成的。

【问题讨论】:

  • 您是在谈论 DTS(旧版)还是 DTSX aka SSIS 包?
  • 抱歉,这是 DTSX(SSIS 包)。
  • 所以您有一个批处理脚本,其中包含从 VB.NET 启动的 dtexec.exe /file myPackage.dtsx ... 之类的内容,并且希望捕获正在运行的包吐出的信息?文本文件够好吗?
  • 是的。 VB.NET 执行远程批处理脚本(具有 dtexec.exe /file myPackage.dtsx)。它已经显示/输出到运行 VB.NET 应用程序的计算机上的命令提示符窗口,但我真的不知道我是否可以/应该解析它,是否需要先将其放入文本文件,或者是否有一个已经存在的方法可以做到这一点。

标签: vb.net ssis


【解决方案1】:

在我的脑海中,最简单的选择是修改批处理脚本以重定向输出。

dtexec.exe /file myPackage.dtsx > myPackage.log

这将覆盖每次执行的日志文件。您可以通过将当前的 %date% 和 %time% 附加到输出文件名来获得更好的体验。

下一个选项可能是更改您的调用代码。您可以让 .NET 代码读取正在显示的内容,而不是重定向批处理脚本以写入文件。不是最好的代码,它是用 C# 编写的,但我需要去开会,没有时间把它改掉。以下代码查看 ProcessResults 对象并提取标准输出和标准错误流。

            this.processStartInfo = new ProcessStartInfo(this.dtUtilPath, parameters);
            this.processStartInfo.RedirectStandardError = true;
            this.processStartInfo.RedirectStandardOutput = true;
            this.processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            this.processStartInfo.UseShellExecute = false;
            System.Diagnostics.Process process = null;

            // Perhaps it would be better to set this to 0 so that it runs to completion
            int waitInMilliSeconds = 1 * 1000;

            process = System.Diagnostics.Process.Start(this.processStartInfo);
            System.IO.StreamReader standardError = process.StandardError;
            System.IO.StreamReader standardOutput = process.StandardOutput;
            process.WaitForExit(waitInMilliSeconds);
            if (process.HasExited)
            {
                // Did it do well?
                // Currently, prints results to console but based on
                // exit code values can do whatever the business need is
                System.Console.WriteLine(standardOutput.ReadToEnd());
                System.Console.WriteLine(standardError.ReadToEnd());
                System.Console.WriteLine(process.ExitCode);
            }

不过,此时,您正在考虑使用上述任一解决方案来解析上述文本以获取“您认为重要的任何信息”。如果是我,并且基于我目前对问题域的了解甚少,我会完全跳过 .NET 对信息的捕获。如果您喜欢双重任务,批处理脚本捕获可能会有所帮助,但我会选择原生 SSIS logging。这将需要对您部署的包进行代码更改,但我发现我拥有最好的 SSIS 体验

  1. 开启日志记录,
  2. 捕获 OnError、OnTaskFailed、OnInformation、OnWarning 和 OnPre/PostExecute 事件
  3. 记录到 SQL Server(2005 将在包部署模式下记录到 dbo.sysdtslog90、2008、R2 和 2012 记录到 dbo.sysssislog。这些表存在于 msdb 中,但如果提供的连接字符串指向不同的目录,则表将在该目录中创建并在那里进行日志记录)

【讨论】:

  • 这里唯一让我感到困惑的是 ProcessResults() 对象。那个物体似乎不存在。我在这里错过了什么吗?
  • 哈,是的,你错过了我通过示例代码看的不够远。我已经在该项目内部定义了该结构。让我清理一下上面的代码
  • 谢谢。我需要一段时间才能完成整个应用程序,但看起来这应该可以工作(或者至少我可以让它工作)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多