【发布时间】:2014-09-04 16:11:32
【问题描述】:
我见过很多代码,但显然它们无济于事。
这是我必须遵循的逻辑:
我正在读取一个包含金额字段的文件。此金额字段可以有负数。如果我在文件中发现负数,我必须移动文件并使包失败。
到目前为止我做了什么:
添加了一个脚本任务来获取文件路径,添加了循环来读取该路径中的所有文件,在循环内部(添加了一个 DTS 任务来将负数的成员移动到记录集,添加了脚本任务来检查是否有任何记录集中的行,如果 count > 0 则脚本任务失败,因此包失败,否则通过)
scipt 任务的代码:
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
using System.Xml;
// name space call here etc, etc..
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
public void Main()
{
// TODO: Add your code here
bool fireAgain = true;
DataTable dtable = new DataTable();
OleDbDataAdapter da = new OleDbDataAdapter();
// Setting this incase there are multiple files being checked
Dts.Variables["InvalidFile"].Value = "False";
da.Fill(dtable, Dts.Variables["NegativeAmountMember"].Value);
// I do get my desired result here of 1
Dts.Events.FireInformation(0, "dtable", dtable.Rows.Count.ToString(), String.Empty, 0, ref fireAgain);
if (dtable.Rows.Count > 0)
{
Dts.Variables["InvalidFile"].Value = "True";
Dts.Events.FireInformation(0, "InvalidFile", Dts.Variables["InvalidFile"].Value.ToString(), String.Empty, 0, ref fireAgain); // This does get displayed but, nothing happens after this step.
Dts.TaskResult = (int)ScriptResults.Failure; // this method never technically executes
return; // added this because someone somewhere said in a post to do so
}
else
{
Dts.TaskResult = (int)ScriptResults.Success;
}
}
我一切正常,除了这个脚本任务失败。
我也尝试过 FireError,即使它没有被调用。
发生了什么,谁能解释一下?
【问题讨论】:
-
我不明白你对
Dts.TaskResult = (int)ScriptResults.Failure;的评论这任务失败了。帮助我了解为什么不会发生这种情况 -
@billinkc 我有执行的火灾信息事件,但是当执行
Dts.TaskResult = (int)ScriptResults.Failure;步骤时,ScriptTask 永远不会停止/失败。它仍处于“黄色阶段”。 -
我认为您需要根据您的要求将
Script Task属性ForcedParentOnFailure或ForcedPackageOnFailure设置为True。你有一个循环容器中的任务。 -
@t_m FailParentOnFailure 和 FailPackageOnFailure 均设置为 true。但是,问题是代码中的死锁。已发布答案。