sql-server - Oracle SSIS 包错误响应

标签 sql-server oracle error-handling ssis-2008

我正在开发一个 2008R2 SSIS 包,它需要读取 CSV 并使用 Oracle 包将行插入到 oracle 数据库中:

我正在使用“OLE DB 的 Oracle 提供程序”(OraOLEDB.Oracle.1)和“OLE DB 命令”与数据库进行通信。

我可以成功地将我的参数映射到查询并插入行。如果 Oracle 包返回错误,我遇到的问题与捕获来自 oracle 的错误响应有关。

当我将“OLE DB 命令”组件设置为“重定向行”时,将通过管道传输到我的结果集中的行,但错误描述似乎是通用的,并且没有提供与 Oracle DB 产生的实际错误相关的任何信息包边。我得到“命令执行产生错误。”

见截图:

Error Rows - Generic Error Captured

我在脚本组件中使用此代码块并在我的重定向行中添加额外的输出来获得错误描述:

 public override void Input0_ProcessInputRow(Input0Buffer Row)
{
   Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);


}

我知道这不是实际的错误,因为当我将 OLE DB 命令设置为使组件出错而不是重新定向行时,我可以在 Package Progress 选项卡上看到我需要捕获的实际错误。

见截图:
enter image description here

有谁知道捕获这些错误的方法,因为它们似乎已被错误行重定向所吞噬?

最佳答案

你想如何处理错误?

  • 如果您只想详细记录它们,可以set up logging到表或文件。
  • 如果您想对它们做一些“有趣”的事情但仍然将它们视为错误,您可以使用 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”列的输出。如果发生数据库错误,我们直接处理。尽管具有最大的灵 active ,但它有一个明显的缺点,即要求您编写手动代码来执行语句,这反而违背了使用 SSIS 的意义。通常,日志记录或事件处理都可以满足您的需求。

    关于sql-server - Oracle SSIS 包错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28625730/

    相关文章:

    sql-server - 使用无意义的 ID 作为我的聚集索引而不是主键

    sql-server - MDX:IIf 维度值的条件始终为假

    java - 确保结果集中的最小行数

    sql - 为什么 SQLPLUS 将空和 null CLOB 显示为 null?

    visual-studio - 类模块中断与未处理错误中断(VB6 错误捕获,IDE 中的选项设置)

    sql-server - 操作导致超出Core配额限制。允许的最大值 : 4, 当前使用中 : 0, 额外请求:6

    sql - "SQL command not properly ended"使用子查询时

    java - 是否可以合并这两个查询?

    javascript - 捕获 <webview> 中由 HTML 标签引起的 "Failed to load resources"错误

    ruby-on-rails - 如何验证(和处理)传递给.to_date的值是否有效或返回错误?