ExecuteNonQuery在插入时不会抛出异常。

3
我正在使用OracleCommand.ExecuteNonQuery()向表中插入数据。一切工作正常,但偶尔会出现记录未被插入的情况。
那么,ExecuteNonQuery()是否可能不插入记录,也不抛出异常?
我没有使用存储过程,也没有使用事务。我记录了由ExecuteNonQuery()抛出的任何异常,但显然没有抛出异常...
我也没有检查ExecuteNonQuery()的返回值。但如果插入成功,ExecuteNonQuery是否可能返回1以外的其他值呢?

这是在代码中进行的事务吗?也许事务没有被提交。 - Jeff Meatball Yang
它们未被插入的原因很有趣......另外,也许你可以发布插入语句。 - Bobby
几年后,我使用4.0 Oracle.DataAccess组件时遇到了同样的问题。当出现错误时,ExecuteNonQuery不会抛出异常,并且它会停止执行该行代码之后的任何代码。 - b.pell
6个回答

3

不应该。ExecuteNonQuery返回一个整数,表示受影响的行数。如果没有插入任何行,则应返回0。当执行查询失败时,它应该抛出异常。例如:连接关闭,表不存在等。


有没有文档说明仅检查异常就足以了解(插入、更新、删除)操作的错误?我可以忽略返回值,只依赖于catch语句吗?此外,在MSDN文档中指出,在.NET 1.1中不会抛出异常,但它并没有说明在.NET 2.0之后一定会抛出异常。 - Nap

2

除非您在某个地方捕获了异常,否则不会出现这种情况,例如:

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

此外,检查ExecuteNonQuery()的返回值。如果它为0,则您可能需要考虑自己抛出异常。

1

这很不太可能。

你是否在更高层级上有错误处理程序,可能会捕获错误并将其丢弃?


1

一切都运行良好,但偶尔会出现记录未被插入的情况。

可能是通过视图进行插入,这样可以允许您插入实际上无法看到的记录。虚拟私有数据库/行级安全性也可以实现此功能。


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
}

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接