检索文件大小SSIS C#

时间:2016-04-28 04:03:07

标签: c# ssis

我正在使用SSIS并使用脚本任务来检索for-each循环中处理的文件的文件大小。我有两个变量。

  • FileFound:这是在foreach文件枚举器中选取的文件的名称

  • FileFoundSize - 这是一个没有值的Int64变量。

我的步骤是:

  • 在for-each容器中拖放脚本任务

  • 编辑脚本 - 我的代码是

    using System;
    using System.IO;                        
    using System.Data;
    using Microsoft.SqlServer.Dts.Runtime;
    using System.Windows.Forms;
    namespace ST_7068b53f6bf04efd812e51a1aee0c396
    {
    
    Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
    
        public void Main()
        {
        FileInfo fileInfo;
        fileInfo = new FileInfo(Dts.Variables["User::FileFound"].Value.ToString());
        Dts.Variables["User::FileFoundSize"].Value = fileInfo.Length;
    
    
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    
    
    enum ScriptResults
    {
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    };
    
    
    }
    }
    

当我执行此任务时,我得到了调用目标抛出的异常。 我的剧本出了什么问题?

2 个答案:

答案 0 :(得分:1)

是的,您需要包含文件扩展名的完整路径。 (技术上是正确的:如果ssis包在文件所在的同一目录中执行,你可以离开路径。但我认为情况并非如此。)

为了使您的代码更健壮,我会执行以下操作:

public void Main()
{
    string fullPath = Path.Combine(Dts.Variables["User::FilePath"].Value.ToString(), Dts.Variables["User::FileFound"].Value.ToString(), Dts.Variables["User::FileExtension"].Value.ToString());
    var fileInfo = new FileInfo(fullPath);

    if (fileInfo.Exists())
    {
        Dts.Variables["FileFoundSize"] = fileInfo.Length;
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    else
    {
        // file could not be found     
        Dts.TaskResult = (int)ScriptResults.Failure;
    }

答案 1 :(得分:1)

从脚本中寻址DTS变量并不好玩。没有设计时验证Variables集合的成员(例如“FileFoundSize”)存在且可用。

除了编辑脚本窗口的真实模态行为(至少在VS2008中,遗憾的是我忘记了使用VS2012时会发生什么),可以防止你翻转到你的包变量显示来检查你是否有拼写右。

我遇到的常见问题是:

  1. 您的代码中的变量名称(有点轻微)拼写错误;
  2. 该变量尚未对主要脚本“可用”     脚本任务屏幕(ReadOnly变量或读/写变量)
  3. 在编码/构建时,这些问题都不会显而易见。 (顺便说一句,如果您尝试通过设置不触发的断点来调试此问题,请检查项目的属性,调试,并确保Use64BitRunTime为FALSE)。