[英]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()的調用...我從來沒有看到任何消息 - 更新失敗,也沒有成功 - 它只是掛在那里,漂浮在空間就像一個藍色的球在月球上。
我復制了一些有用的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.