【问题标题】:Why would a statement execute in Toad but not in my code?为什么语句会在 Toad 中执行,而不是在我的代码中?
【发布时间】:2012-05-18 11:46:52
【问题描述】:

这是我的代码:

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 编辑器中将“:PLATYPUS”替换为值“Phineas”,记录确实已更新,因为“27 个记录受影响”消息和随后的 SQL Select 返回更新的记录显示。

但在我的 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 语句返回的结果提供)来简化查询,它会运行(并且几乎是瞬间运行)。

所以,我猜嵌套的子选择 对于解析更新语句的任何东西来说都太多了......

【问题讨论】:

  • @")";这是您正在使用的还是您实际上用查询替换它
  • 在 Toad 中工作的有效查询由左尖括号、bla bla bla、右尖括号表示。
  • 将其剥离成一个简单的复制品 - 例如一个带有虚拟数据的表模式和在 TOAD 中工作但在代码中不起作用的更新语句......

标签: c# sql oracle devart dotconnect


【解决方案1】:

在您 ExecuteNonQuery() 之后,再次使用 CommandText COMMIT 调用 ExecuteNonQuery。甲骨文说它记录了它自动提交的文件,但实际上并非如此。只有在您关闭连接时才会提交。

【讨论】:

    【解决方案2】:

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

    顺便说一句:在 TOAD 中,菜单 Database -> Monitor -> Session Browser,找到您的“C#”或 TOAD oracle 会话并查看“Locks”选项卡,有两个子选项卡“Blocking locks”和“Blocked locks ”。会话挂起时是否有任何条目?

    【讨论】:

    • 我不需要在 Toad 中点击提交,因为它在 Toad 中有效。 Visual Studio/C#/devArt dotConnect for Oracle 是问题所在。
    • Toad 中的会话监控听起来很有希望,但是当我尝试这样做时,我得到了对话框:“需要访问以下视图: "
    • 但是今天早上它工作得很好——同样的代码;所以我猜这是昨天的一些数据库问题......
    • 它起作用了,因为您没有从 toad 更新记录。尝试在不提交的情况下从 toad 更新相同的记录,然后运行您的应用程序并使其更新与 toad 更新相同的行。它会挂起。
    猜你喜欢
    • 2020-06-23
    • 2021-07-07
    • 1970-01-01
    • 2021-04-02
    • 2021-06-10
    • 2019-11-13
    • 1970-01-01
    • 2021-01-16
    • 2019-09-16
    相关资源
    最近更新 更多