我正在使用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 ;
}
答案 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,但是如果不给连接委托此处理程序,则不会在本机引发错误。想法?