我有一个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是正确的,并且正在做同样的事情!
我在这里很茫然。这没有道理!
任何帮助将不胜感激!
答案 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;
}
作为一般设计技巧,您也许可以在逻辑流中注入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中的示例代码不是必需的。