【问题标题】:Retrieve File Size SSIS C#检索文件大小 SSIS C#
【发布时间】:2016-04-28 20:15:21
【问题描述】:

我正在使用 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
    };
    
    
    }
    }
    

当我执行这个任务时,我得到一个调用的目标抛出了异常。 我的脚本有什么问题?

【问题讨论】:

  • 您的代码很简单,我的第一个最佳猜测是您的 FileFound 变量没有正确填充,或者您的 FileInfo 命令无法访问该文件。在您的 Main() 方法中放置一个断点并遍历它。
  • 你可能是对的。 FileFound 变量是否需要是文件的完整路径,包括文件名和扩展名?目前,我的 FileFound 变量是一个字符串。

标签: c# ssis


【解决方案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;
    }

【讨论】:

  • 谢谢。我确实知道该文件存在,因此我不需要那个额外的循环。
【解决方案2】:

在脚本中处理 DTS 变量并不有趣。没有设计时验证变量集合的成员(例如“FileFoundSize”)是否存在且可用。

随着编辑脚本窗口的令人发指的模态行为(至少在 VS2008 中,遗憾的是我已经忘记了使用 VS2012 时会发生什么)阻止您翻转到您的包变量显示以检查您是否有拼写对。

我遇到的常见问题:

  1. 您的代码中的变量名(非常轻微)拼写错误;
  2. 该变量尚未对主脚本中的脚本“可用” 脚本任务屏幕(只读变量,或读/写变量)

这些问题在编码/构建时都不明显。 (顺便说一句,如果您尝试通过设置不触发的断点来调试此问题,请检查项目的属性、调试,并确保 Use64BitRunTime 为 FALSE)。

【讨论】:

  • 只是为了确认:它在 2012 年以上不再是模态的。
  • 谢谢。它给了我希望,因为当我离开这里并再次使用 VS2012 时。 VS2008 我的脑袋已经牢牢地卡在了 VS2008 上,以至于我忘记了我对 VS2012+ 的了解......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多