簡體   English   中英

為什么語句在Toad中執行而在我的代碼中不執行?

[英]Why would a statement execute in Toad but not in my code?

這是我的代碼:

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 Select返回更新的記錄顯示。

但是在我的C#應用​​程序中,它掛起了對ExecuteNonQuery()的調用...我從來沒有看到任何消息 - 更新失敗,也沒有成功 - 它只是掛在那里,漂浮在空間就像一個藍色的球在月球上。

UPDATE

我復制了一些有用的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?

同樣,這個查詢運行在蟾蜍很好,但它相當復雜的:它包含兩個嵌套的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語句的任何東西太過分了......

執行UPDATE后,您是否在TOAD中點擊了“提交”按鈕? 看起來它只是因為鎖定更新的行而掛起。

BTW:在TOAD中,菜單Database - > Monitor - > Session Browser,找到你的“C#”或TOAD oracle會話並查看“Locks”選項卡,有兩個子標簽“Blocking locks”和“Blocked locks”。 您的會話掛起時是否有任何條目?

ExecuteNonQuery()之后,使用CommandText COMMIT再次調用ExecuteNonQuery 甲骨文稱其自動提交的文檔但實際上並非如此。 它僅在您關閉連接時提交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM