1

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

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;

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

4

1 回答 1

0

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

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

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

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

如果你真的想使用script task. 把你的script task后面DFT放在你的foreach loop. 有另一个object类型的变量,它将保存 adatatable或其他东西。用文件名等填充它DataTable。然后在你foreach需要another script task加载表并获取要处理的文件名之后。老实说,在最后一步,最容易使用system.io和移动脚本中的文件。

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

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

您实际上可能必须variable.value在此行之前测试用户是否为空,我不是肯定的。

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这样你就不需要脚本任务了。

于 2016-06-19T16:16:57.947 回答