繁体   English   中英

ExecuteNonQuery不会在插入时引发异常

[英]ExecuteNonQuery doesn't throw exception on insert

我正在使用OracleCommand.ExecuteNonQuery()插入表中。 一切正常,但有时不插入记录。 那么ExecuteNonQuery()是否可能不会插入记录并且也不会引发异常?

我没有使用存储过程。 我没有使用交易。 我正在记录ExecuteNonQuery()引发的任何异常,但显然没有异常引发...我也不在检查ExecuteNonQuery()的返回值。 但是,如果插入成功,ExecuteNonQuery是否有可能返回另一个值而不是1?

不应该这样 ExecuteNonQuery返回一个整数,指示受影响的行数。 如果未插入任何行,则应返回0。 无法执行查询时,应引发异常。 例如:连接已关闭,表不存在,等等。

除非您在某处吞下了异常,否则不会这样,除非:

try
{
   DoSomethingOnTheDbThatMightThrowAnException();
}
catch(Exception ex)
{
   // Do nothing, thus swallowing the exception
}

另外,检查ExecuteNonQuery()的返回值。 如果为0,则可能要考虑自己引发异常。

这不太可能。

您是否有更高级别的错误处理程序,可能会捕获错误并将其丢弃?

“一切正常,但有时不插入记录。” 可能插入/通过一个视图,该视图可以允许您插入实际上看不到的记录。 虚拟专用数据库/行级安全性也可以做到这一点。

仅作记录,我遇到了这个问题。

发生这种情况的原因是,当我从单元格为存储的proc构建Command参数时,我正在从gridviewcell中连续测试null或DBNull.Value。

像这样:

if(cell.Value != DBNull.Value && cell.Value != null)  
{    
    //add the parameter to the Command object  
}

这意味着当我得到一个空字符串并且当时Convert.ToDecimal没有引发NumberFormatException时,它正在创建一个参数。

相反,当我尝试执行cmd.ExecuteNonQuery()时,引发了NumberFormatException。

我猜想当ExecuteNonQuery()启动时,会在运行时发生转换。

我通过切换到以下方式修复了它:

if(cell.Value != DBNull.Value &&
!string.IsNullOrEmpty(cell.Value.ToString()))
{
   //Create and Add the parameter
}

可能是ExecuteNonQuery()引发了您的try-catch块未捕获的异常。 检查Windows事件日志以确保; 由于您的驱动程序之一崩溃,可能会发生AccessViolationException,并且从.NET 4.0开始的托管代码中通常无法捕获这种异常。 在此链接上描述了一种解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM