为什么语句在Toad中执行而在我的代码中不执行?

时间:2012-05-09 22:23:22

标签: c# sql oracle devart dotconnect

这是我的代码:

private void UpdatePlatypus(String APetPlatypus) 
{
    oracleConnectionMainForm.Open();
    OracleCommand ocmd = new OracleCommand();
    ocmd.Connection = oracleConnectionMainForm;
    try 
    {
        ocmd.CommandText = @"<Update SQL statement that contains one parameter, like so: "WHERE DUCKBILLEDPLATYPUS = :PLATYPUS">)";
        ocmd.Parameters.Add("PLATYPUS", APetPlatypus);
        ocmd.ExecuteNonQuery();
    } 
    catch (Exception e) 
    {
        MessageBox.Show(String.Format("UpdatePlatypus failed with message {0}", e.Message));
    } 
    finally 
    {
        oracleConnectionMainForm.Close();
    }
    MessageBox.Show(String.Format("UpdatePlatypus to {0} succeeded", APetPlatypus));
}

在Toad中,这个SQL工作正常 - 我只是在Toad SQL编辑器中将值“Phineas”替换为“:PLATYPUS”,并且记录实际上已更新为“受影响的27条记录”消息和后续SQL选择返回更新的记录显示。

但是在我的C#应用​​程序中,它挂起了对ExecuteNonQuery()的调用...我从未看到任何消息 - 更新失败,也没有成功 - 它只是挂在那里,漂浮在空间中月球上的蓝色球。

更新

我为dotConnect for Oracle复制了一些旧的更新代码,但是它仍然做同样的事情(挂起调用ExecuteNonQuery()

private void UpdatePlatypus(String APetPlatypus) {

    OracleCommand ocmd;

    oracleConnectionMainForm.Open();
    String update = @"<same update sql as above>";
    ocmd = new OracleCommand(update, oracleConnectionMainForm);
    ocmd.CommandType = CommandType.Text;
    try {
        OracleParameter p_DuckbilledPlatypus =
        new OracleParameter("DIVISION", OracleDbType.NVarChar, ParameterDirection.Input);
        p_DuckbilledPlatypus.Value = APetPlatypus;
        ocmd.Parameters.Add(p_DuckbilledPlatypus);
        using (var transaction = oracleConnectionMainForm.BeginTransaction()) {
            try {
                ocmd.Transaction = transaction;
                ocmd.ExecuteNonQuery();
                transaction.Commit();
            } catch (Exception ex) {
                transaction.Rollback();
                throw;
            }
        }
    } catch (Exception e) {
        MessageBox.Show(String.Format("UpdatePlatypus failed with message {0}", e.Message));
    } finally {
        oracleConnectionMainForm.Close();
    }
    MessageBox.Show(String.Format("UpdatePlatypus to {0} succeeded", APetPlatypus));
}

另一个更新

即使它是有效的SQL,SQL语句是否可能因为解析它而过于混乱?

同样,这个查询在Toad中运行正常,但 非常复杂:它包含两个嵌套的Select语句,如下所示:

Update <tableName> 
Set <col = value> 
where <col> in 
(select bla from bla where bla = :Platypus) 
and (bla is null or bla)
and bla in (select distinct bla from bla 
where bla = bla and bla is not null)

再次更新

如果我通过用参数替换子选项来简化查询(通过从那些atmoic SQL select语句返回的结果提供),它就会运行(并且几乎是瞬间完成的)。

所以,我猜嵌套的子选择 对于解析Update语句的任何东西都是 ......

2 个答案:

答案 0 :(得分:1)

执行UPDATE后,您是否在TOAD中点击了“提交”按钮?它看起来只是因为锁定更新的行而挂起。

BTW:在TOAD中,菜单数据库 - &gt;监控 - &gt;会话浏览器,找到你的“C#”或TOAD oracle会话并查看“锁定”选项卡,有两个子选项卡“阻塞锁定”和“阻塞锁定”。您的会话挂起时是否有任何条目?

答案 1 :(得分:1)

使用CommandText ExecuteNonQuery() ExecuteNonQuery再次呼叫COMMIT之后。甲骨文称其自动提交的文档但实际上并非如此。它仅在您关闭连接时才会提交。