C# SSIS:创建文件夹的相同脚本。不同的结果?

C# SSIS:创建文件夹的相同脚本。不同的结果?,c#,ssis,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_3b9dbb4827024d4ea9e1bcfe00118d

我有一个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变量尝试创建文件夹之前,我确认它是正确的,并且我还确认它不会进入exists IF语句并被踢出

其他3个脚本运行良好,只是这一个,关键是我在一小时前运行了它,它运行良好

为了更好的衡量,我把代码从第一个复制到了第二个。运气不好。 我还将脚本任务从第一个循环复制到第二个循环,将0更改为1,但这也不起作用。然后,我将脚本任务从第一个循环复制到第二个循环,没有进行任何更改,它创建了文件夹(不与循环一起工作,但创建了文件夹)。 我最终删除了有问题的脚本任务,创建了一个全新的脚本任务,并手动输入代码。我添加了一个调试弹出窗口,以便确认folderName是正确的。folderName是正确的,它也在做同样的事情

我在这里真是不知所措。这毫无意义


非常感谢您的帮助!

您的脚本任务成功结束,因为您通过使用CATCH来抑制外部异常,而无需重新刷新或重定向到SSIS事件

另一件事是,您正在使用MessageBox.Show。当您将包放到生产环境中时,它将中断包的执行

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

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

  • 真正的异常消息将被传递到SSIS基础结构,包括日志、报告
  • 任务将处于失败状态,因此您将有一个明确的迹象表明出现了问题

作为一个一般的设计技巧,您可能可以插入一个逻辑流,以了解脚本任务中正在发生的事情,或者仅仅使用VS shell进行调试。除了Alexander的出色回答之外,我要指出,还有一种本地SSIS方法用于目录创建:

在您的例子中,我将创建Folder0、Folder1、Folder2等变量,并指定它们应作为表达式进行计算

@[User::FolderName] + "\\Folder_T0_" + @[User::OrderID]
这种方法的好处在于,您可以在各种文件系统任务上设置断点,以确保生成的字符串是您希望生成的字符串


您还可以将脚本任务放入包中,以自动将这些FolderN名称放入包的运行日志中进行回顾性调试。不需要输入示例代码和Biml。

您是否尝试调试两个函数中
folderName
的实际值?是的,变量是正确的(添加到问题中)你能发布一个循环的图像以及它们是如何连接的吗?也可以在每个循环的catch上添加一个<代码> FieleRoor(<)>代码,这样你的捕获不会悄悄地隐藏消息。如果每个循环是相同的,为什么不在C 5倍上循环而不是5个不同的脚本?@ DyryY49,你的问题被回答了吗?如果是的话,考虑把它标记为这样的一个。
@[User::FolderName] + "\\Folder_T0_" + @[User::OrderID]