列名未正确加载 SSIS 中的 c# 脚本
Column names are not loading correctly c# scripting in SSIS
我是使用 SSIS 在 C# 中编写脚本的新手,所以我不确定为什么会这样。我正在使用脚本组件来读取一些文件。我的带有 _“下划线”的列名显示不正确
错误代码是这样的。
严重性代码描述项目文件行抑制状态
错误 CS1061 'Output0Buffer' 不包含 'funded_amnt' 的定义,并且无法找到接受类型 'Output0Buffer' 的第一个参数的可访问扩展方法 'funded_amnt'(您是否缺少 using 指令或汇编参考?)
当您向脚本任务添加列时,我并不知道这些规则,但是,在数据流列名称与脚本任务中的可用名称之间发生了转换。鉴于您的数据流中带有下划线的每一列都被报告为错误,我猜这是列名中的有效字符之一,它不允许出现在缓冲区的字段名称中。
如果我猜的话,下划线会被删除,因为脚本中的每一列都添加了一个 _IsNull 属性,并且多个下划线可能会使某处的逻辑复杂化。
给定源查询
SELECT 1 AS col1, 2 AS col_underscore_2;
我的数据流任务中有两列名为 col1
和 col_underscore_2
。将两者添加到脚本任务
这是我的输入缓冲区的结果 auto-generated 定义 (BufferWrapper.cs)
public class Input0Buffer: ScriptBuffer
{
public Input0Buffer(PipelineBuffer Buffer, int[] BufferColumnIndexes, OutputNameMap OutputMap)
: base(Buffer, BufferColumnIndexes, OutputMap)
{
}
public Int32 col1
{
get
{
return Buffer.GetInt32(BufferColumnIndexes[0]);
}
}
public bool col1_IsNull
{
get
{
return IsNull(0);
}
}
public Int32 colunderscore2
{
get
{
return Buffer.GetInt32(BufferColumnIndexes[1]);
}
}
public bool colunderscore2_IsNull
{
get
{
return IsNull(1);
}
}
new public bool NextRow()
{
return base.NextRow();
}
new public bool EndOfRowset()
{
return base.EndOfRowset();
}
}
值得注意的是,它将 col_underscore_2
转换为内部列名称 colunderscore2
。如果你想看到相同的内容,请双击解决方案资源管理器中的 BufferWrapper.cs 或将光标放在 public override void Input0_ProcessInputRow(Input0Buffer Row)
中的 Input0Buffer
上,然后按 F12(转到定义)
如果您想查看自动生成的列,
我认为缓冲区名称也有类似的逻辑。
我假设您正在尝试自动生成脚本任务,并且您需要考虑到这一点。此外,如果 LendingClassRow 可能为空,则您需要具有类似
的逻辑
if(LendingClassRow.verification_status != null)
{
Output0Buffer.verificationstatus = LendingClassRow.verification_status
}
// This entire block is not needed as it will be the default if no value is
// assigned but I call it out here in case future readers have a need to
// muck with it
else
{
Output0Buffer.verificationstatus_IsNull = true;
}
我是使用 SSIS 在 C# 中编写脚本的新手,所以我不确定为什么会这样。我正在使用脚本组件来读取一些文件。我的带有 _“下划线”的列名显示不正确
错误代码是这样的。 严重性代码描述项目文件行抑制状态 错误 CS1061 'Output0Buffer' 不包含 'funded_amnt' 的定义,并且无法找到接受类型 'Output0Buffer' 的第一个参数的可访问扩展方法 'funded_amnt'(您是否缺少 using 指令或汇编参考?)
当您向脚本任务添加列时,我并不知道这些规则,但是,在数据流列名称与脚本任务中的可用名称之间发生了转换。鉴于您的数据流中带有下划线的每一列都被报告为错误,我猜这是列名中的有效字符之一,它不允许出现在缓冲区的字段名称中。
如果我猜的话,下划线会被删除,因为脚本中的每一列都添加了一个 _IsNull 属性,并且多个下划线可能会使某处的逻辑复杂化。
给定源查询
SELECT 1 AS col1, 2 AS col_underscore_2;
我的数据流任务中有两列名为 col1
和 col_underscore_2
。将两者添加到脚本任务
这是我的输入缓冲区的结果 auto-generated 定义 (BufferWrapper.cs)
public class Input0Buffer: ScriptBuffer
{
public Input0Buffer(PipelineBuffer Buffer, int[] BufferColumnIndexes, OutputNameMap OutputMap)
: base(Buffer, BufferColumnIndexes, OutputMap)
{
}
public Int32 col1
{
get
{
return Buffer.GetInt32(BufferColumnIndexes[0]);
}
}
public bool col1_IsNull
{
get
{
return IsNull(0);
}
}
public Int32 colunderscore2
{
get
{
return Buffer.GetInt32(BufferColumnIndexes[1]);
}
}
public bool colunderscore2_IsNull
{
get
{
return IsNull(1);
}
}
new public bool NextRow()
{
return base.NextRow();
}
new public bool EndOfRowset()
{
return base.EndOfRowset();
}
}
值得注意的是,它将 col_underscore_2
转换为内部列名称 colunderscore2
。如果你想看到相同的内容,请双击解决方案资源管理器中的 BufferWrapper.cs 或将光标放在 public override void Input0_ProcessInputRow(Input0Buffer Row)
中的 Input0Buffer
上,然后按 F12(转到定义)
如果您想查看自动生成的列,
我认为缓冲区名称也有类似的逻辑。
我假设您正在尝试自动生成脚本任务,并且您需要考虑到这一点。此外,如果 LendingClassRow 可能为空,则您需要具有类似
的逻辑if(LendingClassRow.verification_status != null)
{
Output0Buffer.verificationstatus = LendingClassRow.verification_status
}
// This entire block is not needed as it will be the default if no value is
// assigned but I call it out here in case future readers have a need to
// muck with it
else
{
Output0Buffer.verificationstatus_IsNull = true;
}