2012-03-19 17 views
2

コンパイルされているようですが、レコードは変更されません。ここで更新ステートメントがテーブルを更新しないのはなぜですか?

は私のコードだ: 更新

private void UpdateRecord(string ATicketID, string ATicketSource, string AContactsEmail, string AAboutSomeID, string ACategoryID) 
{ 
    try 
    { 
     con = new OracleConnection(oradb); 
     con.Open(); 

     String query = "UPDATE ABC.CONCERTTICKETS SET TICKETSOURCE = :p_TICKETSOURCE, ABOUTSOMEID = :p_ABOUTSOMEID, CATEGORYID = :p_CATEGORYID, CONTACTEMAIL = :p_CONTACTEMAIL WHERE TICKETID = :p_TICKETID"; 

     cmd = new OracleCommand(query, con); 
     cmd.CommandType = CommandType.Text; 

     OracleParameter p_TICKETID = 
      new OracleParameter("p_TICKETID", OracleDbType.NVarchar2, ParameterDirection.Input); 
     p_TICKETID.Size = 20; 
     p_TICKETID.Value = ATicketID; 
     cmd.Parameters.Add(p_TICKETID); 

     OracleParameter p_TICKETSOURCE = 
      new OracleParameter("p_TICKETSOURCE", OracleDbType.NVarchar2, ParameterDirection.Input); 
     p_TICKETSOURCE.Size = 20; 
     p_TICKETSOURCE.Value = ATicketSource; 
     cmd.Parameters.Add(p_TICKETSOURCE); 

     OracleParameter p_ABOUTSOMEID = 
      new OracleParameter("p_ABOUTSOMEID", OracleDbType.Int32, ParameterDirection.Input); 
     p_ABOUTSOMEID.Value = AAboutSOMEID; 
     cmd.Parameters.Add(p_ABOUTSOMEID); 

     OracleParameter p_CATEGORYID = 
      new OracleParameter("p_CATEGORYID", OracleDbType.Int32, ParameterDirection.Input); 
     p_CATEGORYID.Value = ACategoryID; 
     cmd.Parameters.Add(p_CATEGORYID); 

     OracleParameter p_CONTACTEMAIL = 
      new OracleParameter("p_CONTACTEMAIL", OracleDbType.NVarchar2, ParameterDirection.Input); 
     p_CONTACTEMAIL.Size = 100; 
     p_CONTACTEMAIL.Value = AContactsEmail; 
     cmd.Parameters.Add(p_CONTACTEMAIL); 

     try 
     { 
      try 
      { 
       ot = con.BeginTransaction(); 
       cmd.Transaction = ot; 
       cmd.ExecuteNonQuery(); 
       ot.Commit(); 
      } 
      catch (Exception) 
      { 
       ot.Rollback(); 
      } 
     } 
     catch (OracleException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     MessageBox.Show("Apparent success"); 
    } 
    finally 
    { 
     con.Close(); 
     con.Dispose(); 
    } 

    dataGridView1.Refresh(); 
} 

=========:

だから、あなたがそうのような意味で、私はそれを取る:

try 
       { 
        using (var transaction = con.BeginTransaction()) 
       { 
        cmd.Transaction = transaction; 
        cmd.ExecuteNonQuery(); 
        transaction.Commit(); 
       } 
       }     
       catch (Exception ex) 
       { 
        ot.Rollback(); 
        throw; 
       } 
       MessageBox.Show("Apparent success"); 

== ========= もう一度更新されました(このコードの動作):

private void UpdateRecord(string ATicketID, string ATicketSource, string AContactsEmail, string AAboutSomeID, string ACategoryID) 
{ 
    try 
    { 
     con = new OracleConnection(oradb); 
     con.Open(); 

     String update = @"UPDATE ABC.CONCERTTICKETS 
          SET TICKETSOURCE = :p_TICKETSOURCE, 
          ABOUTSOMEID = :p_ABOUTSOMEID, 
          CATEGORYID = :p_CATEGORYID, 
          CONTACTEMAIL = :p_CONTACTEMAIL 
          WHERE TICKETID = :p_TICKETID"; 

     cmd = new OracleCommand(update, con); 
     cmd.CommandType = CommandType.Text; 

     // TICKETSOURCE, ABOUTLLSID, CATEGORYID, CONTACTEMAIL, TICKETID 
     OracleParameter p_TICKETSOURCE = 
      new OracleParameter("p_TICKETSOURCE", OracleDbType.NVarchar2, ParameterDirection.Input); 
     p_TICKETSOURCE.Size = 20; 
     p_TICKETSOURCE.Value = ATicketSource; 
     cmd.Parameters.Add(p_TICKETSOURCE); 

     OracleParameter p_ABOUTSOMEID = 
      new OracleParameter("p_ABOUTSOMEID", OracleDbType.Int32, ParameterDirection.Input); 
     p_ABOUTSOMEID.Value = AAboutSOMEID; 
     cmd.Parameters.Add(p_ABOUTSOMEID); 

     OracleParameter p_CATEGORYID = 
      new OracleParameter("p_CATEGORYID", OracleDbType.Int32, ParameterDirection.Input); 
     p_CATEGORYID.Value = ACategoryID; 
     cmd.Parameters.Add(p_CATEGORYID); 

     OracleParameter p_CONTACTEMAIL = 
      new OracleParameter("p_CONTACTEMAIL", OracleDbType.NVarchar2, ParameterDirection.Input); 
     p_CONTACTEMAIL.Size = 100; 
     p_CONTACTEMAIL.Value = AContactsEmail; 
     cmd.Parameters.Add(p_CONTACTEMAIL); 

     OracleParameter p_TICKETID = 
      new OracleParameter("p_TICKETID", OracleDbType.NVarchar2, ParameterDirection.Input); 
     p_TICKETID.Size = 20; 
     p_TICKETID.Value = ATicketID; 
     cmd.Parameters.Add(p_TICKETID); 

     using (var transaction = con.BeginTransaction()) 
     { 
      try 
      { 
       cmd.Transaction = transaction; 
       cmd.ExecuteNonQuery(); 
       transaction.Commit(); 
      } 
      catch (Exception ex) 
      { 
       transaction.Rollback(); 
       throw; 
      } 
     } 

     MessageBox.Show("Apparent success"); 
    } 
    finally 
    { 
     con.Close(); 
     con.Dispose(); 
    } 
    Popul8TheGrid(); 
} 
+0

あなたの外側のtryブロックは役に立たない。あなたはあなたの内側の試みで例外をキャッチしています。 – c0deNinja

+1

これはおそらくロールバックされていますが、そのcatchブロックの例外を除いて何もしていないので、あなたはそれを知らないでしょう。 –

+0

外側のtryブロックを削除しました。私はそれを踏んで、ロールバックには達しません。 "success" msgを実行、コミット、および表示しますが、テーブルには影響しません。 –

答えて

5

私はあなたが本当に例外がスローされた、トランザクションが成功した場合、トランザクションがロールバックされたりされたかどうかを区別するための方法を持っていないことに注意してください。例外をキャッチし、トランザクションをロールバックしてから、「見かけの成功」というメッセージボックスを表示しています。例外を飲み込んで転落しているからです。理由は、people scream from the top of rooftops to not swallow exceptionsです。

例外がスローされていると思われます。あなたはそれをキャッチし、ロールバックしてから、メッセージボックスを表示して混乱させてしまいます。これはひどく書かれたコードであり、ひどく書かれたコードはこのようなバグを引き起こします。

少なくとも、私があなただったら私は例外を却下したいと思います。

catch (Exception) { 
    ot.Rollback(); 
    throw; 
} 

しかし、より良い、私の更新ステートメントがテーブルを更新していない理由だけ

using(var transaction = con.BeginTransaction()) { 
    cmd.Transaction = transaction; 
    cmd.ExecuteNonQuery(); 
    transaction.Commit(); 
} 

usingブロック内のトランザクションの使用をラップ?

コードにバグがあります。これらのステートメント

ot = con.BeginTransaction(); 
cmd.Transaction = ot; 
cmd.ExecuteNonQuery(); 
ot.Commit(); 

の一つが例外をスローしていますが、すべての例外を嚥下しているので、あなたはそれを知りません。例外を飲み込むのをやめてください。これらの行のうちどれが例外をスローしているのか、その理由を知ることができます。次に、根本的な問題をデバッグするための詳細情報があります。

+0

いいえ、それをステップ実行し、うまく動作し、catchブロックに到達しません。 –

+0

BeginTransaction..Commitブロックまで推薦している投稿を更新しました。 –

+0

いいえ、それは私が意味するものではありません。外側の 'try/catch'を失います。 – jason

6

あなたのtry/catchブロックは完全に壊れています。

これを修正してから、実際のエラーの内容を確認する必要があります。

try 
{ 
    ot = con.BeginTransaction(); 
    cmd.Transaction = ot; 
    cmd.ExecuteNonQuery(); 
    ot.Commit(); 
    MessageBox.Show("Success"); // <-- this should be here, not after the catch! 
} 
catch (Exception) 
{ 
    ot.Rollback(); 
    throw; // <-- this is important otherwise the exception is swallowed! 
} 
+0

ありがとうございました。私は "throw"を追加するようにコードを変更しました。ただし、ロールバックには達していません。 –

3

このコードは、ユーザーに通知することなくトランザクションをロールバックします。

catch (Exception) 
    { 
     ot.Rollback(); 
    } 
関連する問題