gpt4 book ai didi

c# - SSIS 读取 System.Object 变量并在脚本组件中写入它...如何?

转载 作者:行者123 更新时间:2023-12-02 04:14:02 26 4
gpt4 key购买 nike

我有一个 SSIS 包,它以一个脚本任务开始,该任务初始化一个空的 DataTable 并将其分配给一个用户变量。我正在添加一些示例行,因为我仍在进行开发。该变量在 SSIS 中称为:FlatFileBadRowDataTracker

public void Main()
{
// TODO: Add your code here
string SSISRunStartTimeStamp = DateTime.Now.ToString("yyyyMMddHHmmss");
Dts.Variables["User::SSISRunStartTimeStamp"].Value = SSISRunStartTimeStamp;
Dts.Variables["User::FlatFileBadRowDataTracker"].Value = BuildSampleDataTable();


Dts.TaskResult = (int)ScriptResults.Success;
}

private DataTable BuildSampleDataTable()
{
DataTable dt = new DataTable();

// ErrorColumn
DataColumn errorColumn = new DataColumn("ErrorColumn");
errorColumn.DataType = System.Type.GetType("System.String");
errorColumn.DefaultValue = string.Empty;
dt.Columns.Add(errorColumn);

// ErrorDescription
DataColumn errorDescription = new DataColumn("ErrorDescription");
errorColumn.DataType = System.Type.GetType("System.String");
errorColumn.DefaultValue = string.Empty;
dt.Columns.Add(errorDescription);

// FileName
DataColumn fileName = new DataColumn("FileName");
errorColumn.DataType = System.Type.GetType("System.String");
errorColumn.DefaultValue = string.Empty;
dt.Columns.Add(fileName);

// RawData
DataColumn rawData = new DataColumn("RawData");
errorColumn.DataType = System.Type.GetType("System.String");
errorColumn.DefaultValue = string.Empty;
dt.Columns.Add(rawData);

// ErrorDescription
DataColumn dataFlowComponent = new DataColumn("DataFlowComponent");
errorColumn.DataType = System.Type.GetType("System.String");
errorColumn.DefaultValue = string.Empty;
dt.Columns.Add(dataFlowComponent);

// Populate with some sample data.
DataRow row;
for (int i = 1; i < 5; i++)
{
row = dt.NewRow();
row["ErrorColumn"] = "ErrorColumn" + i;
row["ErrorDescription"] = "ErrorDescription" + i;
row["FileName"] = "FileName" + i;
row["RawData"] = "RawData" + i;
row["DataFlowComponent"] = "SSIS_DataFlowTask_" + i;
dt.Rows.Add(row);
}

return dt;
}

#region ScriptResults declaration
/// <summary>
/// This enum provides a convenient shorthand within the scope of this class for setting the
/// result of the script.
///
/// This code was generated automatically.
/// </summary>
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion

然后我有一个数据流任务,它读取一个文本文件(通过平面文件源组件读取 csv),并有一个脚本组件(作为转换)来确定行是好是坏。好的行被发送到脚本组件的“GoodRow”输出,坏的行被发送到“BadRows”输出。通常,一个文件大部分都是好的行,但少数会有数据错误(例如:电子邮件列中有一些与电子邮件地址不同的内容),在这种情况下,组件必须将其发送到 BadRows 输出。我的目标是将错误相关的数据(例如具有数据错误的列名称和一些描述)捕获到我之前在脚本任务中创建的同一个数据表中。

我已将此变量添加到“脚本组件编辑器”屏幕的“属性”下的“ReadWriteVariables”中。我在 PreExecute() 中使用它来获取 DataTable 的架构并将其分配给 dt,这是我在开头声明的局部变量类。

public override void PreExecute()
{
base.PreExecute();
dt = (DataTable)Variables.FlatFileBadRowDataTracker;

}

然后,当我在 Input0_ProcessInputRow(Input0Buffer Row) 方法中发现与数据相关的错误时,我尝试将数据添加到 dt 中。之后在 PostExecute( ) 我尝试将 dt 分配回用户变量。

public override void PostExecute()
{
base.PostExecute();
Variables.FlatFileBadRowDataTracker = dt;
}

但是,当我运行该包时,我收到此错误(如下所示),它告诉我无法在 PreExecute() 方法中使用该变量。看来我只能在 PostExecute() 方法中使用它。我需要数据表的现有数据+架构,否则我将不得不重新创建架构,并且我将丢失数据(目前只是代码中所示的测试数据)。

enter image description here

有什么方法可以在我的脚本组件中获取数据表的架构+数据吗?脚本组件也不允许我在 ReadOnlyVariables 和 ReadWriteVariables 中添加变量。看来我只能将其添加到其中之一。

最佳答案

尝试使用变量分配器而不是选择变量作为读写变量:

预执行阶段:

IDTSVariables100 vars = null;
VariableDispenser.LockForRead("User::FlatFileBadRowDataTracker");
VariableDispenser.GetVariables(out vars);
dt = (DataTable)vars["User::FlatFileBadRowDataTracker"].Value;
vars.Unlock();

执行后阶段:

IDTSVariables100 vars = null;
VariableDispenser.LockForWrite("User::FlatFileBadRowDataTracker");
VariableDispenser.GetVariables(out vars);
vars["User::FlatFileBadRowDataTracker"].Value = dt;
vars.Unlock();
<小时/>

有关更多信息,请参阅:

关于c# - SSIS 读取 System.Object 变量并在脚本组件中写入它...如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60153939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com