SSIS:使用相同脚本创建文件夹。结果不同?

时间:2019-02-11 09:01:52

标签: c# ssis

我有一个SSIS包,它可以进行一些循环并动态创建目录。我有5个循环,所以每个循环中都有一个脚本副本。

这是我的第一个循环:

#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
#endregion

namespace ST_3b9dbb4827024d4ea9e1bcfe00118dcc
{

    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        public void Main()
        {
            String OrderIDStr = Dts.Variables["User::OrderID"].Value.ToString();
            String folderName = (string)Dts.Variables["User::FolderName"].Value + "\\Folder_T0_" + OrderIDStr;

            try
            {
                // Determine whether the directory exists.
                if (Directory.Exists(folderName))
                {   return; }

                // Try to create the directory.
                DirectoryInfo di = Directory.CreateDirectory(folderName);
            }
            catch (Exception e)
            {   System.Windows.Forms.MessageBox.Show(e.ToString(),"Process Failed");    }
            finally { }
        }
    }
}

效果很好。然后转到具有以下内容的第二个循环(设置folderName变量时,唯一的区别是T0与T1:

#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
#endregion

namespace ST_3b9dbb4827024d4ea9e1bcfe00118dcc
{

    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        public void Main()
        {
            String OrderIDStr = Dts.Variables["User::OrderID"].Value.ToString();
            String folderName = (string)Dts.Variables["User::FolderName"].Value + "\\Folder_T1_" + OrderIDStr;

            try
            {
                // Determine whether the directory exists.
                if (Directory.Exists(folderName))
                { return; }

                // Try to create the directory.
                DirectoryInfo di = Directory.CreateDirectory(folderName);
            }
            catch (Exception e)
            { System.Windows.Forms.MessageBox.Show(e.ToString(), "Process Failed"); }
            finally { }
        }
    }
}

运行时,它表示任务已成功,并且没有弹出任何错误消息。但是,该文件夹实际上并未创建,因此写入该文件夹的下一个任务当然会崩溃。 我已确认folderName变量在尝试创建文件夹之前是正确的,并且还确认它不会进入存在的IF语句并被踢出。

其他3个脚本运行良好,仅此一个,而最重要的是我在一个小时前运行了该脚本,并且运行良好!

为了很好,我将代码从第一个复制到了第二个。没运气。 我也将脚本任务从第一个循环复制到了第二个,将0更改为1,但也没有用。然后,我将脚本任务从第一个循环复制到第二个,然后DID N'T进行任何更改,并创建了文件夹(不适用于循环,但创建了文件夹)。 我最终删除了令人讨厌的脚本任务,并创建了一个全新的脚本任务,并手动输入了代码。我添加了一个调试弹出窗口以进行良好测量,以便可以确认folderName是正确的。 folderName是正确的,并且正在做同样的事情!

我在这里很茫然。这没有道理!

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

您的脚本任务成功完成,因为您通过使用CATCH而不重新抛出或重定向到SSIS事件来抑制外部异常。

另一件事是您正在使用MessageBox.Show。当您将其投入生产时,它将破坏程序包的执行

因此,请考虑替换此代码:

catch (Exception e)
 { 
     System.Windows.Forms.MessageBox.Show(e.ToString(), "Process Failed"); 
 }

使用:

catch (Exception e)
 { 
    Dts.Events.FireError(-1, "Task Name", e.message, String.Empty, 0);
    Dts.TaskResult = (int)ScriptResults.Failure;  
 }
  • 实际的异常消息将传递到SSIS基础结构,包括日志,报告
  • 任务将处于失败状态,因此您将清楚地表明出了什么问题

作为一般设计技巧,您也许可以在逻辑流中注入Dts.Events.FireInformation来了解脚本任务中发生的事情,或者仅使用VS shell进行调试

答案 1 :(得分:3)

除了Alexander的出色回答外,我还要指出,目录创建还有一种本地SSIS方法:File System Task

在您的情况下,我将创建诸如Folder0,Folder1,Folder2之类的变量,并指定应将它们作为表达式求值。表达式变为

@[User::FolderName] + "\\Folder_T0_" + @[User::OrderID]

这种方法的好处是,您可以在各种文件系统任务上设置一个断点,以确保生成的字符串是您希望生成的字符串。

您还可以将脚本任务放入程序包中,以将那些FolderN名称自动放入程序包的运行日志中,以进行追溯调试。 test for echo和Biml中的示例代码不是必需的。