在 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 ;
}
在这里找到我的答案:
数据库连接信息消息回调不会立即触发存储的过程打印语句
我没有遇到发布问题的人的问题。我只需要为信息消息委托提供一个处理程序。我的处理程序如下所示:
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,但是在没有向连接委托提供此处理程序的情况下,不会本机引发错误。思潮?