【问题标题】:Insert, Update, Delete for Oracle are not working in .NET C#?Oracle 的插入、更新、删除在 .NET C# 中不起作用?
【发布时间】:2012-10-25 15:13:29
【问题描述】:

我处理 oracle 和 .net 已经有一段时间了,它们似乎并不是完美的搭配。这是一件奇怪的事情,我没有找到任何原因或如何解决它。

我做了简单的插入、更新和删除,但它们不起作用。它失败了

cmd.ExecuteNonQuery();

这是一段代码:

sqlCommand = string.Format(@" INSERT INTO TABLE_1
                              (ID, NAME, DESCRIPTION)
                              VALUES ((SELECT MAX(ID)+1 FROM TABLE_1),'{0}','{1}')", name, description);

using (OracleConnection conn = new OracleConnection(connectionString))
{
 OracleCommand cmd = new OracleCommand(sqlCommand, conn);
 cmd.CommandType = commandType;

 try
 {
  conn.Open();
  result = cmd.ExecuteNonQuery();                    
 }
 catch (Exception ex) { throw;}
 finally
 {
  conn.Close();
 }

一个简单的插入,对吧?!当我调试时,我得到了 cmd.Text 值(那将是 sqlCommand),并且我确实在 oracle db 中执行它,它运行得很好。当我在.Net中执行它时,它放弃了。

这是已知情况吗?有什么解决办法,有什么解释吗?

提前谢谢

【问题讨论】:

  • 当你说“放弃”时,你是什么意思?你得到一个例外,还是它只是挂起。如果是例外,请发布完整的详细信息。此外,如果您发布更多代码可能会有所帮助。尝试在创建 SqlCommand 对象和执行它的位置发布完整的例程。
  • 不,它只是一直执行很长一段时间,或者看起来是这样。
  • 我看不出代码有任何明显错误(除了 SQL 注入风险,以及您不必要地捕获和抛出异常)。您是否仔细检查过您的连接字符串是否正确?
  • 是的,没关系,那段代码工作正常,连接正常。我可以检索数据,但没有别的。连接打开,它挂在 cmd.ExecuteNonQuery()
  • 这不是权限问题,我的意思是我确实有权在 db 中读取和写入数据

标签: c# oracle


【解决方案1】:

这与您的问题无关,但是:

您应该使用序列而不是选择 (SELECT MAX(ID)+1 FROM TABLE_1) 生成id

【讨论】:

  • 是的,我知道,我已经读过这方面的内容,但我对 oracle 还很陌生,所以为了更快地做事,我会即兴发挥。这个问题有什么线索吗?
  • 只要你意识到这在多用户环境中是不正确的,因为不同的连接可以从 max(id)+1 得到相同的结果。调试的时候挂在哪里?
  • thnx,我会解决这个问题,所以我正在阅读有关 oracle 的更多信息。正如 ai 在挂在 cmd.ExecuteNonQuery(); 之前所说的那样。所以,这不是一个已知的情况......
【解决方案2】:

我认为您的桌子被某人锁定了。还是表有位图索引?位图索引不应该在多个用户同时改变数据的环境中使用,因为它们会锁定很多。在 oltp 环境中使用 BTree 索引。

这与您的问题无关,但是:

当您使用 Oracle 时,您必须使用参数化查询而不是 string.Format(..{}...)。参数化查询要快得多,因为这意味着 Oracle 不必解析每个 sql 语句。

然后做类似的事情

create sequence table_1_seq

insert into table_1 (id, , ) values (table_1_seq.nextval, , ) 填写id。

代替

(SELECT MAX(ID)+1 FROM TABLE_1)

因为这在多用户环境中不起作用。

编辑 1

您可以运行此选择来确定是否存在位图索引:

select index_name,table_name from all_indexes 
where index_type = 'BITMAP';

【讨论】:

    【解决方案3】:

    好吧,我想我只是想出了一个合理的解释:

    数据库应该一直忙于执行另一个更新删除或插入操作,因此您无限期地等待它从应用程序执行更新。

    我也有你的问题。我的问题是:

    我们如何避免这种等待,或者从数据库中获得“我很忙-稍后再试”的消息,以便用户知道发生了什么?

    【解决方案4】:

    取决于您如何执行此操作;你可以使用:

        catch (Exception ex)
        {
    System.Data.OracleClient.OracleException oEx = (System.Data.OracleClient.OracleException)ex.InnerException;
    
          if (oEx.Message.IndexOf("ORA-0054") != 0)
          {
             .... do something here...    
          }
    

    .. 它将检测是否发生了锁定。 YMMV 虽然我只在 Oracle 9i 上使用过它。

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题。我不知道如何解决它。当我在没有运行 sqldeveloper 的情况下运行程序时,它运行得很好。我对这个问题的回答:关闭任何其他使用从您的计算机连接到 oracle 的程序。对我来说一切顺利。

      【讨论】:

        【解决方案6】:

        插入:

        insert into student values('rahul',474,'mca','phase2');
        

        删除:

        delete from student where roll_no=472;
        

        更新:

        update student set address='phase7' where roll_no=474;
        

        【讨论】:

          【解决方案7】:

          提交在 Oracle 客户端(如 Toad 或 SQL-Developer)中使用的任何查询

          如果您想同时使用 oracle 客户端(如 Toad 或 sSQL-Developer)和 .net,则不允许并行使用,然后在使用 .net 之前在 oracle 客户端中使用提交。

          然后尝试将它与 .net 一起使用 - 这会起作用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-09
            • 2021-08-05
            • 2011-02-27
            • 1970-01-01
            • 1970-01-01
            • 2018-02-04
            相关资源
            最近更新 更多