我正在使用OracleCommand.ExecuteNonQuery()插入表中。一切正常,但偶尔也不会插入记录。 那么ExecuteNonQuery()是否可能不插入记录而且也不会抛出异常?
我没有使用存储过程。 我没有使用交易。 我正在记录ExecuteNonQuery()抛出的任何异常,但显然没有抛出异常...... 我也不检查ExecuteNonQuery()的返回值。但是,如果插入成功,ExecuteNonQuery是否可能返回另一个值?
答案 0 :(得分:3)
不应该。 ExecuteNonQuery返回一个整数,指示受影响的行数。如果未插入任何行,则应返回0。它在执行查询失败时应抛出异常。 E.x。:连接关闭,表不存在等等。
答案 1 :(得分:2)
除非你在某处吞下异常,否则不会这样:
try
{
DoSomethingOnTheDbThatMightThrowAnException();
}
catch(Exception ex)
{
// Do nothing, thus swallowing the exception
}
另外,检查ExecuteNonQuery()
的返回值。如果为0,您可能需要考虑自己抛出异常。
答案 2 :(得分:1)
这不太可能。
你是否有更高级别的错误处理程序,可能会捕获错误并将其丢弃?
答案 3 :(得分:1)
“一切正常,但偶尔也不会插入记录。” 可能插入/通过视图,可以允许您插入您实际看不到的记录。虚拟专用数据库/行级安全性也可以这样做。
答案 4 :(得分:0)
只是为了记录我遇到了这个问题。
之所以发生这种情况是因为我在从单元格构建存储过程的命令参数时,从一行中的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
}
答案 5 :(得分:0)
可能是ExecuteNonQuery()抛出了一个未被try-catch块捕获的异常。检查您的Windows事件日志以确定;由于您的某个驱动程序崩溃,可能会发生AccessViolationException,并且从.NET 4.0开始,托管代码中通常无法捕获这种异常。此link上描述了一个解决方案。