我有一个SSIS包,可以进行一些循环并动态创建目录.我有5个循环,所以我在每个循环中都有一个脚本副本. 这是我的第一个循环: #region Namespacesusing System;using System.Data;using Microsoft.SqlServe
这是我的第一个循环:
#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,这也不起作用.然后我将脚本任务从第一个循环复制到第二个循环并且不进行任何更改,并且它创建了文件夹(不适用于循环,但它创建了文件夹).
我终于删除了有问题的脚本任务,并创建了一个全新的脚本任务,并手动输入代码.我添加了一个调试弹出窗口,以便我可以确认folderName是否正确. folderName是正确的,它正在做同样的事情!
我在这里真的很茫然.这没有意义!
任何帮助将不胜感激!
您的脚本任务成功结束,因为您通过使用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进行调试