1

我在 c# 中有一个控制台应用程序,可以从网站下载文件。我创建了一个变量Filecount,用于计算在该实例中下载的文件数。

在 SSIS 中,我在执行过程任务配置中设置了 StandardOutputVariable,因为User::FileCount它应该通过它已下载的文件数。

我想创建一个 SQL 任务,如果文件计数大于0.

但是,当我尝试评估我的表达式时,它总是返回为真,但是,这不应该发生,因为没有通过任何计数,但这意味着它应该被评估为假。

有人可以解释我是否写错了表达式或错误地设置了变量?


int fileCount = 0;

using (var client = new HttpClient(handler))
{
    client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");
    var response = await client.GetAsync(siteUrl + "/_api/Web/GetFolderByServerRelativeUrl('XXX')/Files");
    response.EnsureSuccessStatusCode();

    json = await response.Content.ReadAsStringAsync();
    Root deserializedResults = JsonConvert.DeserializeObject<Root>(json);               

    foreach (Result result in deserializedResults.d.results)
    {
        if (result.TimeCreated > DateTime.Today.AddDays(-7))
        {
            DownloadFileViaRestAPI(siteUrl, credentials, "XXX", result.Name, "XXX");
            fileCount++;
        }                    
    }
}

Console.Write(fileCount);

SSIS 执行进程任务;

StandardOutVariable = User::FileCount

SQL 任务表达式;

Property: Disable 
Expression: Len(Trim(@[User::FileCount])) > 0 ? False : True
4

1 回答 1

1

tl;博士; 您所描述的内容和我的实施工作正常,因此您的情况出现了其他问题。

设置

我构建了一个简单的 SSIS 包。执行包任务->脚本任务(将变量值转储到控制台)->具有禁用逻辑的序列容器=>另一个脚本任务(如果禁用有效/无效,则转储到控制台)

在此处输入图像描述

我有你的原始变量,String 类型的 User::FileCount 并添加User::HasFile了 Boolean 类型的表达式Len(Trim(@[User::FileCount])) > 0来测试你的逻辑。

SO_71067359.bat

我创建了一个批处理文件,它将用作您的 C# 应用程序。需要时,我将删除第 2 行,因此不会生成任何输出。内容是

@echo off
echo 1

结果

C:\ssisdata>SO_71067359.bat
1

EPT 下载文件

执行打包任务。工作目录设置为我的批处理文件的位置。可执行文件是批处理脚本。标准输出变量是User::FileCount

在此处输入图像描述

SCR 回波

这是我的标准回显脚本,我将添加User::FileCountUser::HasFile. 当包运行时,这会将值转储到控制台输出,这是我可以复制和粘贴的内容,这与大多数人熟悉的漂亮结果选项卡不同

万一我的博客消失的内容是

bool fireAgain = false;
string message = "{0}::{1} : {2}";
foreach (var item in Dts.Variables)
{
    Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), "", 0, ref fireAgain);
}

SEQC 模拟其他

这是一个序列容器,其中直接添加了禁用逻辑。是的,我有变量,但由于你有结果的反转,我不想玷污测试。

是的,它跑了

序列容器内是 SCR Echo Back 的副本/粘贴,但我将其重命名为“是的,它运行了”并指定唯一的变量是System::TaskName 如果任务运行,控制台将打印任务的名称。

测试第一轮

批处理脚本的输出将为“1”,因此我们希望看到 Inner 任务触发。让我们检查一下控制台

SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\SO_71067359.dtsx" starting.
Information: 0x0 at SCR Echo Back, SCR Echo Back: User::FileCount->1
Information: 0x0 at SCR Echo Back, SCR Echo Back: User::HasFiles->True
Information: 0x0 at Yes it ran, SCR Echo Back: System::TaskName->Yes it ran
SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\SO_71067359.dtsx" finished: Success.
The program '[2268] DtsDebugHost.exe: DTS' has exited with code 0 (0x0).

测试第 2 轮

清除 bat 文件的第 2 行

SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\SO_71067359.dtsx" starting.
Information: 0x0 at SCR Echo Back, SCR Echo Back: User::FileCount->
Information: 0x0 at SCR Echo Back, SCR Echo Back: User::HasFiles->False
SSIS package "C:\Users\bfellows\source\repos\SO_Trash\SO_Trash\SO_71067359.dtsx" finished: Success.
The program '[75252] DtsDebugHost.exe: DTS' has exited with code 0 (0x0).
于 2022-02-10T15:55:38.377 回答