【发布时间】: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