SSIS 脚本组件 Input0Buffer 方法没有 GetName()?
SSIS Script Component Input0Buffer method no GetName()?
我正在寻找一种在 SSIS 数据流任务脚本组件中获取我的 属性 名称的方法。我一直在高低搜索,只找到 this。我一直在努力让这段代码正常工作,但我太新手了,无法理解这里发生了什么,而且我觉得它没有得到很好的解释(无意冒犯)。
此组件之前的来源使用 SQL 查询连接两个表。在组件内部,我想比较列。然后调用我创建的一个更新方法来使用SqlConnection来执行更新。
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (Row.TableALastName != Row.TableBLastName)
// Call the update method if the last name did not match.
this.UpdateRecord("TableBLastName", Row.TableALastName.ToString(), Row.TableAAssociateId.ToString());
}
}
private void UpdateRecord(string columnName, string change, string associateId)
{
SqlConnection sqlConnection;
sqlConnection = new SqlConnection(this.Variables.Connection);
string updateQuery = "UPDATE [SomeDataBase].[dbo].[TableB] SET " + columnName + " = " + change + " WHERE [Associate_ID] = " + associateId;
using (SqlCommand cmd2 = new SqlCommand(updateQuery, sqlConnection))
{
sqlConnection.Open();
cmd2.ExecuteNonQuery();
sqlConnection.Close();
}
}
我想以某种方式获得 Row.TableBLastName 的 PropertyName,而不必为我正在做的每个测试硬编码 "TableBLastName",这会很多。
问题是输入缓冲区 class 没有 Property.GetName() 这也意味着我无法向 class 添加方法来获取 属性 名称,因为每个 运行.
都会重新生成
您已经在 SSIS 中,所以我会建议使用它(无论我通常跳到 C# 来解决问题的速度有多快)
这是一个经典的条件拆分场景:
进行测试,然后 运行 将结果放入 SQL 更新语句。
public Input0_ProcessInputRow(Input0Buffer Row)
{
Dictionary<string, List<string>> list = new Dictionary<string, List<string>>();
List<string> propertyList = new List<string>();
Type myType = typeof(Input0Buffer);
PropertyInfo[] allPropInfo = myType.GetProperties();
List<PropertyInfo> SqlPropInfo = allPropInfo.Where(x => !x.Name.Contains("AM_")).ToList();
// Loop through all the Sql Property Info so those without AM_
for (int i = 0; i < SqlPropInfo.Count(); i++)
{
List<string> group = new List<string>();
foreach (var propInfo in allPropInfo)
{
if (propInfo.Name.Contains(SqlPropInfo[i].Name))
{
// Group the values based on the property
// ex. All last names are grouped.
group.Add(propInfo.GetValue(Row, null).ToString());
}
}
// The Key is the Sql's Property Name.
list.Add(SqlPropInfo[i].Name, group);
}
foreach (var item in list)
{
// Do a check if there are two values in both SQL and Oracle.
if (item.Value.Count >= 2)
{
if (item.Value.Count() != item.Value.Distinct().Count())
{
// Duplicates exist do nothing.
}
else
{
// The values are different so update the value[0]. which is the SQL Value.
UpdateRecord(item.Key, item.Value[0], Row.AssociateId);
}
}
}
}
我将值与两个 table 分开,因此表 A 和表 B 中有两个列表值。您可以为 TableA 中的值添加前缀 "AM_" 或不同的东西,这样您就可以使用反射来获取带前缀和不带前缀的属性,并找出哪些值属于哪个 table。然后我只是循环遍历属性并将值与目标值中的属性分组(因此那些没有前缀 "AM_")然后我循环遍历分组列表并比较两个值,如果它不同,更新 TableA 与匹配它们的 TableB 值
我正在寻找一种在 SSIS 数据流任务脚本组件中获取我的 属性 名称的方法。我一直在高低搜索,只找到 this。我一直在努力让这段代码正常工作,但我太新手了,无法理解这里发生了什么,而且我觉得它没有得到很好的解释(无意冒犯)。
此组件之前的来源使用 SQL 查询连接两个表。在组件内部,我想比较列。然后调用我创建的一个更新方法来使用SqlConnection来执行更新。
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (Row.TableALastName != Row.TableBLastName)
// Call the update method if the last name did not match.
this.UpdateRecord("TableBLastName", Row.TableALastName.ToString(), Row.TableAAssociateId.ToString());
}
}
private void UpdateRecord(string columnName, string change, string associateId)
{
SqlConnection sqlConnection;
sqlConnection = new SqlConnection(this.Variables.Connection);
string updateQuery = "UPDATE [SomeDataBase].[dbo].[TableB] SET " + columnName + " = " + change + " WHERE [Associate_ID] = " + associateId;
using (SqlCommand cmd2 = new SqlCommand(updateQuery, sqlConnection))
{
sqlConnection.Open();
cmd2.ExecuteNonQuery();
sqlConnection.Close();
}
}
我想以某种方式获得 Row.TableBLastName 的 PropertyName,而不必为我正在做的每个测试硬编码 "TableBLastName",这会很多。
问题是输入缓冲区 class 没有 Property.GetName() 这也意味着我无法向 class 添加方法来获取 属性 名称,因为每个 运行.
都会重新生成您已经在 SSIS 中,所以我会建议使用它(无论我通常跳到 C# 来解决问题的速度有多快)
这是一个经典的条件拆分场景:
进行测试,然后 运行 将结果放入 SQL 更新语句。
public Input0_ProcessInputRow(Input0Buffer Row)
{
Dictionary<string, List<string>> list = new Dictionary<string, List<string>>();
List<string> propertyList = new List<string>();
Type myType = typeof(Input0Buffer);
PropertyInfo[] allPropInfo = myType.GetProperties();
List<PropertyInfo> SqlPropInfo = allPropInfo.Where(x => !x.Name.Contains("AM_")).ToList();
// Loop through all the Sql Property Info so those without AM_
for (int i = 0; i < SqlPropInfo.Count(); i++)
{
List<string> group = new List<string>();
foreach (var propInfo in allPropInfo)
{
if (propInfo.Name.Contains(SqlPropInfo[i].Name))
{
// Group the values based on the property
// ex. All last names are grouped.
group.Add(propInfo.GetValue(Row, null).ToString());
}
}
// The Key is the Sql's Property Name.
list.Add(SqlPropInfo[i].Name, group);
}
foreach (var item in list)
{
// Do a check if there are two values in both SQL and Oracle.
if (item.Value.Count >= 2)
{
if (item.Value.Count() != item.Value.Distinct().Count())
{
// Duplicates exist do nothing.
}
else
{
// The values are different so update the value[0]. which is the SQL Value.
UpdateRecord(item.Key, item.Value[0], Row.AssociateId);
}
}
}
}
我将值与两个 table 分开,因此表 A 和表 B 中有两个列表值。您可以为 TableA 中的值添加前缀 "AM_" 或不同的东西,这样您就可以使用反射来获取带前缀和不带前缀的属性,并找出哪些值属于哪个 table。然后我只是循环遍历属性并将值与目标值中的属性分组(因此那些没有前缀 "AM_")然后我循环遍历分组列表并比较两个值,如果它不同,更新 TableA 与匹配它们的 TableB 值