在 c# 中的 try/catch 中未捕获数据库异常

本文关键字:数据库 异常 catch 中的 try | 更新日期: 2023-09-27 18:33:25

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

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

[1380564032.174591 - 09/30/2013 13:00:32.174591] ( 未检索的错误 message="[IBM][CLI 驱动程序][DB2/AIX64] SQL0407N 空值的赋值 值到非空列"TBSPACEID=2, TABLEID=4, COLNO=7" 不是 允许。 SQLSTATE=23502

" ( [1380564032.186504

- 2013/09/30 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 ;
}

在 c# 中的 try/catch 中未捕获数据库异常

在这里找到我的答案:

数据库连接信息消息回调不会立即触发存储的过程打印语句

我没有遇到发布问题的人的问题。我只需要为信息消息委托提供一个处理程序。我的处理程序如下所示:

    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,但是在没有向连接委托提供此处理程序的情况下,不会本机引发错误。思潮?