【问题标题】:ExecuteNonQuery doesn't throw exception on insertExecuteNonQuery 不会在插入时抛出异常
【发布时间】:2010-12-22 10:57:37
【问题描述】:

我正在使用 OracleCommand.ExecuteNonQuery() 插入表中。一切正常,但偶尔没有插入记录。 那么 ExecuteNonQuery() 是否有可能不插入记录并且也不抛出异常?

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

【问题讨论】:

  • 这是在代码的事务中完成的吗?也许事务没有被提交。
  • 他们没有被插入的why原因会很有趣......另外,也许你可以发布插入语句。
  • 几年后,但我对 4.0 Oracle.DataAccess 组件也有同样的问题。出现错误时,ExecuteNonQuery 不会引发异常,并且会停止执行该行之后的任何代码。

标签: c# sql oracle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    发生这种情况是因为我在从单元格构建存储过程的命令参数时连续测试来自 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
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        除非你在某个地方吞下了异常,否则不会,像这样:

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

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

        【讨论】:

          【解决方案5】:

          这不太可能。

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • 是否有任何文档说明检查异常足以知道(插入、更新、删除)操作的错误?我可以忽略返回值而只依赖于 catch 语句。此外,在 MSDN 文档中,它声明异常不会在 .NET 1.1 中引发,但它并没有说明之后肯定会在 .NET 2.0 上引发异常。
            猜你喜欢
            • 2015-12-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-16
            • 1970-01-01
            • 1970-01-01
            • 2013-05-24
            相关资源
            最近更新 更多