【问题标题】:Database exception not being caught in try/catch in c#c# 中的 try/catch 未捕获数据库异常
【发布时间】:2013-09-30 20:05:26
【问题描述】:

我正在使用 C# 中的 OdbcConnection 处理 DB2 数据库。我从未见过数据库抛出的 sql 异常从未被捕获,但果然,我现在遇到了这种情况。根据我的打印语句,我打开和关闭连接的语句工作正常。我将代码包围在 try/catch 中,并在 try/catch 主体以及异常主体中的各个点写入日志文件。我在异常正文中的日志语句从未写入过……我的日志记录中的所有帐户,数据库插入都很好……只是就 DB2 而言它没有。

这是我看到的跟踪的一个有趣部分:

[1380564032.174591 - 09/30/2013 13:00:32.174591](未检索到的错误 message="[IBM][CLI Driver][DB2/AIX64] SQL0407N 分配 NULL NOT NULL 列“TBSPACEID=2,TABLEID=4,COLNO=7”的值不是 允许。 SQLSTATE=23502

") [1380564032.186504 - 09/30/2013 13:00:32.186504]

我最初使用的是 ExecuteScalar。我试过 ExecuteNonQuery 和 ExecuteReader。都有相同的错误和相同的问题,错误未在 try/catch 中捕获。

想法?

编辑 1

代码如下:

public void InsertRecord(MyObject entry)
{
    try
    {

        OpenConnection();

        // Prep command object.             
        using (OdbcCommand cmd = new OdbcCommand(Queries.InsertRecord, this.odbcCn))
        {
            cmd.CommandTimeout = 30;
            cmd.CommandType = CommandType.Text;

            //Force error testing
            entry.Zip = "9999999999999999999999999999999999999999999999999999999999999999";

            cmd.Parameters.Add(new OdbcParameter("@ZIP", ntry.Zip));

            object o = cmd.ExecuteReader(CommandBehavior.SingleResult);

            int id = -1;

            LogUtil.WriteCondensed("Insert to db succeeded. Id: " + id.ToString());
        }
    }
    catch (OdbcException e)
    {
        LogUtil.Write("INSERT ROW", "Exception occurred");
        CloseConnection();
        throw;
    }
    catch (Exception e)
    {
        LogUtil.Write("INSERT ROW","Exception occurred");
        CloseConnection();
        throw;
    }
    finally
    {
        CloseConnection();
    }

    return ;
}

【问题讨论】:

  • “我在 try/catch 中包围代码”- 请向我们展示所有相关代码。
  • 请参阅文档msdn.microsoft.com/en-us/library/… 了解 ExecuteNonQuery,这是您应该使用的。请向我们展示您的代码,以便我们了解可能出现的问题。很多人捕获 SQLException 而不是所有异常。如果您的异常类型与抛出的不匹配,您的捕获将失败。
  • 用代码更新了帖子。感谢您的意见。
  • 您可以删除catch (OdbcException e),因为catch (Exception e) 具有相同的代码。另外,从catch (Exception e) 块中删除CloseConnection();,因为CloseConnection(); 将始终在finally 块中调用。

标签: c# database db2 odbc database-connection


【解决方案1】:

在这里找到我的答案:

DB connection InfoMessage callback not firing immediately for stored proc print statements

我没有遇到发布问题的人的问题。我只需要为 InfoMessage 委托提供一个处理程序。我的处理程序看起来像:

    private static void OnInfoMessage(Object sender, OdbcInfoMessageEventArgs args)
    {
        StringBuilder sb = new StringBuilder();

        if (args != null && args.Errors != null &&
            args.Errors.Count > 0)
        {
            foreach (OdbcError error in args.Errors)
            {
                sb.AppendLine(error.Message);
            }

            LogUtil.WriteException("InsertRow", new Exception(sb.ToString()));
        }

        if (!String.IsNullOrEmpty(args.Message))
        {
            LogUtil.Write("InsertRow", args.Message);
        }

    }

感谢大家的意见。你有什么要补充的吗?请注意,我在插入语句上使用了 ExecuteReader,但是如果不给连接委托这个处理程序,错误就不会被本地抛出。想法?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2013-12-05
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多