将字符串值存储到对象中并在以后使用

时间:2016-06-19 09:22:17

标签: ssis etl script-task

我想将正在处理的文件名存储到变量中?然后使用此变量(文件名)将这些文件移动到proccessed文件夹中。我正在使用foreach循环,其中数据流任务处理每个文件并使用in循环将文件名存储到脚本任务中的对象中。

string filename = Dts.Variables["User::FILE_NAME"].Value.ToString();
object proccessed_file_name;
proccessed_file_name += filename;
Dts.Variables["User::FILE_NAME"].Value = proccessed_file_name;

请帮我将字符串值存储到对象中,然后在包中使用。

1 个答案:

答案 0 :(得分:0)

您可以在没有脚本任务且只有1个变量User::FILE_NAME的情况下执行此操作。

在目录上使用foreach loop,填充该任务的FILE_NAME。通过数据流转换处理文件。然后移动文件。然后只需让foreach loop继续。通过逐步移动文件,您将确切地知道什么是成功的和失败的,并且能够重新启动您的过程,而无需回滚正确处理并从头开始的文件。

如果您想等待移动所有内容,您可以进行两阶段移动。 1与上面相同的逻辑只是重命名为.processed或原始目录中的某些东西。然后在该循​​环完成后,对已处理的文件添加另一个foreach过滤,然后使用相同的FILE_NAME变量并移动您的文件。

在任何一种情况下都不需要script task

如果你真的想使用script task。将script task放在DFT之后foreach loop。有另一个object类型的变量,它将包含datatable或其他内容。使用文件名等填充DataTable。然后在foreach之后,您将需要another script task,这将加载表并获取您要处理的文件名。老实说,在最后一步,最简单的方法是使用system.io并在脚本中移动文件。

你如何使用datatable类似的变量(我正在自由地写这个,所以这可能需要额外的步骤和错误检查。)

将文件名填充到DataTable,使File_Name变量可读,DataTableVariableName可读/写脚本任务,然后从以下内容开始:

你可能实际上必须在此行之前测试用户variable.value的null我不是肯定的。

system.data.datatable dt = (system.data.datatable)Dts.Variables["User::DataTableVariableName"].Value;

if (dt == null)
{
   Write code to create your datatable
}
Add new DataRow to table -- lots of results on web about this and creating datatable.

现在你有了datatable。在foreach loop添加script task后移动已处理的文件。

再次从变量

中检索表开始
system.data.datatable dt = (system.data.datatable)Dts.Variables["User::DataTableVariableName"].Value;

然后遍历datatable,我建议也在这里移动文件。

foreach (dt datarow in dt.rows)
{
  typically I like to suggest copying and then deleting the source file depending on how you over write. so you would do something like.
If (system.io.file.Exists(dr.["FileNameRowLable"].ToString())
{
   system.io.file.copy(source, destination);
   if (file.exists(destination))
   {
      file.delete(source);
   }
}
}

我认为你会更乐意在f oreach loop中移动文件,这样你就不需要脚本任务了。