我正在使用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
};
}
}
当我执行此任务时,我得到了调用目标抛出的异常。 我的剧本出了什么问题?
答案 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时会发生什么),可以防止你翻转到你的包变量显示来检查你是否有拼写右。
我遇到的常见问题是:
在编码/构建时,这些问题都不会显而易见。 (顺便说一句,如果您尝试通过设置不触发的断点来调试此问题,请检查项目的属性,调试,并确保Use64BitRunTime为FALSE)。