Oracle SSIS 包错误响应
Oracle SSIS Package Error Response
我正在开发 2008R2 SSIS 包,它需要读取 CSV 并使用 Oracle 包将行插入到 oracle 数据库中:
我正在使用 'Oracle Provider for OLE DB' (OraOLEDB.Oracle.1) 和 'OLE DB Command' 与数据库通信。
我可以成功地将我的参数映射到查询并插入行。如果 Oracle 包 return 出错,我遇到的问题与捕获来自 oracle 的错误响应有关。
当我将我的 'OLE DB Command' 组件设置为 'Re-direct Row' 时,行通过管道传输到我的结果集中,但错误描述似乎是通用的,并且没有提供与实际产生的错误相关的任何信息在 Oracle 数据库包端。我得到 'The command execution generated errors.'
查看截图:
我在脚本组件中使用此代码块并向我的重定向行添加了额外的输出,得到了错误的描述:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);
}
我知道这不是实际的错误,因为当我将 OLE DB 命令设置为使组件出错而不是重定向行时,我可以在包进度中看到我需要捕获的实际错误选项卡
见截图:
有谁知道捕获这些错误的方法,因为它们似乎已被错误行重定向吞没?
您想如何处理这些错误?
- 如果您只是想详细记录它们,可以set up logging 到 table 或文件。
- 如果您想对它们做一些 "interesting" 但仍然将它们视为错误,您可以使用 error event handler (将引发多个事件,其中一个包含详细消息) .
- 如果这些都不能完全满足您的需求,您始终可以将 OLE DB 命令组件替换为 Script Component,您可以在其中手动执行命令并捕获生成的异常。
选项 1 和 2 有据可查;选项 3 涉及更多,只有在您希望以完全自定义的方式从个别行中的错误中恢复的高级场景中才需要。示例:
public override void Input0_ProcessInputRow(Input0Buffer Row) {
try {
using (var connection = (OleDbConnection) Connections.Connection.AcquireConnection(null)) {
using (var command = connection.CreateCommand()) {
command.CommandText = "TwiddleKnob";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@p0", OleDbType.VarChar, 50).Value = Row.Name;
command.ExecuteNonQuery();
}
}
} catch (OleDbException e) {
Row.ErrorDescription = e.Errors.Count > 0 ? e.Errors[0].Message : e.Message;
}
}
这里的脚本组件必须配置连接管理器和带有 "ErrorDescription" 列的输出。如果发生数据库错误,我们直接处理。尽管具有最大的灵活性,但它有一个明显的缺点,即需要您手动编写代码来执行语句,这与使用 SSIS 的意义相悖。通常日志记录或事件处理都可以满足您的需求。
我正在开发 2008R2 SSIS 包,它需要读取 CSV 并使用 Oracle 包将行插入到 oracle 数据库中:
我正在使用 'Oracle Provider for OLE DB' (OraOLEDB.Oracle.1) 和 'OLE DB Command' 与数据库通信。
我可以成功地将我的参数映射到查询并插入行。如果 Oracle 包 return 出错,我遇到的问题与捕获来自 oracle 的错误响应有关。
当我将我的 'OLE DB Command' 组件设置为 'Re-direct Row' 时,行通过管道传输到我的结果集中,但错误描述似乎是通用的,并且没有提供与实际产生的错误相关的任何信息在 Oracle 数据库包端。我得到 'The command execution generated errors.'
查看截图:
我在脚本组件中使用此代码块并向我的重定向行添加了额外的输出,得到了错误的描述:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);
}
我知道这不是实际的错误,因为当我将 OLE DB 命令设置为使组件出错而不是重定向行时,我可以在包进度中看到我需要捕获的实际错误选项卡
见截图:
有谁知道捕获这些错误的方法,因为它们似乎已被错误行重定向吞没?
您想如何处理这些错误?
- 如果您只是想详细记录它们,可以set up logging 到 table 或文件。
- 如果您想对它们做一些 "interesting" 但仍然将它们视为错误,您可以使用 error event handler (将引发多个事件,其中一个包含详细消息) .
- 如果这些都不能完全满足您的需求,您始终可以将 OLE DB 命令组件替换为 Script Component,您可以在其中手动执行命令并捕获生成的异常。
选项 1 和 2 有据可查;选项 3 涉及更多,只有在您希望以完全自定义的方式从个别行中的错误中恢复的高级场景中才需要。示例:
public override void Input0_ProcessInputRow(Input0Buffer Row) {
try {
using (var connection = (OleDbConnection) Connections.Connection.AcquireConnection(null)) {
using (var command = connection.CreateCommand()) {
command.CommandText = "TwiddleKnob";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("@p0", OleDbType.VarChar, 50).Value = Row.Name;
command.ExecuteNonQuery();
}
}
} catch (OleDbException e) {
Row.ErrorDescription = e.Errors.Count > 0 ? e.Errors[0].Message : e.Message;
}
}
这里的脚本组件必须配置连接管理器和带有 "ErrorDescription" 列的输出。如果发生数据库错误,我们直接处理。尽管具有最大的灵活性,但它有一个明显的缺点,即需要您手动编写代码来执行语句,这与使用 SSIS 的意义相悖。通常日志记录或事件处理都可以满足您的需求。