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

时间:2013-09-30 20:05:27

标签: c# database db2 odbc database-connection

我正在使用c#中的OdbcConnection处理DB2数据库。我从未见过数据库抛出的SQL异常永远不会被捕获,但果然,我现在遇到了这种情况。我要陈述的声明根据我的打印声明关闭连接工作正常。我在try / catch中包含代码,并在try / catch正文和异常正文中的各个点写入日志文件。异常体中的我的日志语句从来没有写过...我的日志记录中的所有帐户,数据库插入都很好......只是它没有涉及到DB2。

以下是我看到的痕迹的一个有趣部分:

  

[1380564032.174591 - 09/30/2013 13:00:32.174591](未经检索的错误   message =“[IBM] [CLI驱动程序] [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 ;
}

1 个答案:

答案 0 :(得分:0)

在这里找到我的答案:

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);
        }

    }

感谢大家的投入。你有什么要补充的吗?请注意,我在insert语句中使用了ExecuteReader,但是如果不给连接委托此处理程序,则不会在本机引发错误。想法?