0

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

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

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

4

1 回答 1

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 日志记录。这将需要对您部署的包进行代码更改,但我发现我拥有最好的 SSIS 体验

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