这是我的代码:
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语句的任何东西都是 ......
答案 0 :(得分:1)
执行UPDATE后,您是否在TOAD中点击了“提交”按钮?它看起来只是因为锁定更新的行而挂起。
BTW:在TOAD中,菜单数据库 - &gt;监控 - &gt;会话浏览器,找到你的“C#”或TOAD oracle会话并查看“锁定”选项卡,有两个子选项卡“阻塞锁定”和“阻塞锁定”。您的会话挂起时是否有任何条目?
答案 1 :(得分:1)
使用CommandText ExecuteNonQuery()
ExecuteNonQuery
再次呼叫COMMIT
之后。甲骨文称其自动提交的文档但实际上并非如此。它仅在您关闭连接时才会提交。