存在SSIS平面文件 - 当没有文件存在时,脚本任务失败

时间:2014-12-16 19:58:35

标签: c# ssis

我在SQL Server 2008 R2下的SSIS(BIDS)中工作。我有一个包,将平面文件导入OLE DB。在导入数据流任务之前,我有一个脚本任务(用C#编写,而不是VB)来测试文件是否存在。我有两个优先约束的脚本任务。第一个是我的成功路径(评估操作='约束'和值='成功'),它转到数据流任务。第二个是我的失败路径(评估操作='约束'和值='失败'),它转到虚拟任务(SQL任务),只是为了在文件不存在时包没有失败

在调试中,我确认,当文件存在时,它会一直通过数据流任务(如预期的那样)。但是,当文件不存在时,包失败;特别是,它在第​​一步失败(即脚本任务)。我不知道我做错了什么。下面是我的脚本任务代码:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;

namespace ST_2f8cf79f6fe0443b9c09c453433a0258.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

        public void Main()
        {
            if (File.Exists(Dts.Variables["PRC_file_path"].Value.ToString()))
            {
                Dts.TaskResult = (int)ScriptResults.Success;
            }
            else
            {
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
        }

    }
}

1 个答案:

答案 0 :(得分:1)

据我所知,它的行为完全符合预期;如果文件不存在,它会使脚本失败。

我会使用变量来报告文件的存在。

public void Main()
{ 
string targetfile = Dts.Variables["PRC_file_path"].Value.ToString();

 if (File.Exists(targetfile))
            {
                Dts.Variables["file_exists"].Value = true;
            }
            else
            {
                 Dts.Variables["file_exists"].Value = false;
            }
Dts.TaskResult = (int)ScriptResults.Success;
}

您希望脚本本身成功,除非遇到错误。

更好的是:

public void Main()
{ 
string targetfile = Dts.Variables["PRC_file_path"].Value.ToString();
  try{
 if (File.Exists(targetfile))
            {
                Dts.Variables["file_exists"].Value = true;
            }
            else
            {
                 Dts.Variables["file_exists"].Value = false;
            }

     Dts.TaskResult = (int)ScriptResults.Success;
     }
 catch (Exception Ex)
     {
     Dts.TaskResult = (int)ScriptResults.Failure;
     }
}

编辑:

忘记提到需要将优先约束从CONSTRAINT切换到Expression和CONSTRAINT,其中表达式计算@file_exists变量。你应该有两个成功路径,一个是变量评估为真,另一个是假。