0

これが私のコードです:

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 で正常に実行されますが、非常に複雑です。次のように、ネストされた 2 つの 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ステートメントを解析するものには多すぎると思います...

4

2 に答える 2

1

CommandTextで再度ExecuteNonQuery()呼び出した後。Oracleは、自動的にコミットすることを文書化したと述べていますが、実際にはそうではありません。接続を閉じたときにのみコミットします。ExecuteNonQueryCOMMIT

于 2012-07-08T11:09:53.433 に答える
1

UPDATE を実行した後、TOAD で「コミット」ボタンを押しましたか? 更新された行のロックが原因でハングしているようです。

ところで: TOAD で、[データベース] -> [モニター] -> [セッション ブラウザー] のメニューを選択し、「C#」または TOAD oracle セッションを見つけて、[ロック] タブを確認します。[ロックのブロック] と [ブロックされたロック] の 2 つのサブタブがあります。セッションがハングしたときにエントリはありますか?

于 2012-05-10T05:31:27.927 に答える