2012-03-23 14 views
4

私は異なるパラメータ値を持つストアドプロシージャを呼び出すループを持っています。 次のコールcmd.ExecuteNonQuery(); 私はトランザクションを使用してすべてまたはロールバックを保存し、checkBox2 - 常に保存します。 問題が1つ見つかり、解決策が見つからない。 catchブロックが起動されたときの最初の問題の後、トランザクションオブジェクトは接続を失います。 t.connectionはnullです。 すべてが良いですが、トランザクションオブジェクトは接続していませんスタートしました!catchトランザクション接続がnullの後のSqlTransaction

try 
     { 

     while (!sr.EndOfStream) 
     { 
      strLine.Remove(0, strLine.Length); 
      //c = sr.ReadLine(); 

      while (c != "-") 
       { 
       c = sr.ReadLine(); 
       strLine.Append(c); 
       if (sr.EndOfStream) break; 
       } 

      //strLine.Append("Nowa pozycja"); 
      try 
      { 
       cmd.Parameters["@s"].Value = strLine.ToString(); 
       cmd.Parameters["@Return_value"].Value = null; 
       cmd.ExecuteNonQuery(); 
      } 
      catch 
      { 
       if (cmd.Parameters["@Return_value"].Value == null) 
       { 
        cmd.Parameters["@Return_value"].Value = -100; 
       } 

       if (((int)cmd.Parameters["@Return_value"].Value == 100) || (checkBox2.Checked)) 
       { 
        if ((int)cmd.Parameters["@Return_value"].Value != 100) 
        { 
         MessageBox.Show("Są błedy! " + cmd.Parameters["@s"].Value); 
        }; 
       } 
      } 

     if (!checkBox2.Checked) 
     { 
      if ((Int32)cmd.Parameters["@Return_value"].Value != 100) 
      { 
       break; 
      } 
     } 

     c = ""; 
     } 
     textBox1.Text = strLine.ToString(); 


     } 
    catch 
     { 
      // t.Rollback(); 
     // t = null; 
      textBox1.Text = strLine.ToString(); 
      textBox1.Visible = true; 
      MessageBox.Show("Wystąpiły problemy w czasie importu " + cmd.Parameters["@s"].Value); 
      //return; 
     } 

     finally 
     { 
      if (cmd.Parameters["@Return_value"].Value == null) 
      { 
       cmd.Parameters["@Return_value"].Value = -100; 
      } 

      if (((int)cmd.Parameters["@Return_value"].Value==100)||(checkBox2.Checked)) 
      { 
       t.Commit(); 
       if ((int)cmd.Parameters["@Return_value"].Value!=100) 
       { 
        MessageBox.Show("Transakcja zapisana ale w pliku były błedy! " + cmd.Parameters["@s"].Value); 
       }; 
      } 
     else 
     { 
      if (t!=null) {t.Rollback();} 
      MessageBox.Show("Transakcja odrzucona!"); 
     } 


     conn2.Close(); 
     aFile.Close(); 
     } 

enter image description here

+0

ブロック内にかなりの量のコードがありません。私はあなたの最初のステップは少し単純化し、ブロック全体を投稿することになると言いたいと思います。また、私は自分の行にカッコを入れない*と考えています。非常に多くの空白を持つ大きなコードブロックをスキャンするのは難しいです。 (それは私の意見です) – NotMe

+0

接続とトランザクションをどのように設定しますか? – Strillo

+0

私はそれらをセットアップしました:if(conn2.State!= ConnectionState.Open)conn2.Open(); SqlTransaction t = conn2.BeginTransaction(); – pdusp

答えて

2

同様の問題に遭遇しました。私の場合、特定のSqlExceptionが発生していました。ほとんどの例外は捕捉されてうまく処理されますが、変換エラー(文字列を数値に変換しようとするなど)が発生するたびに、トランザクションが自動的に終了します。

これを修正するには、コマンドオブジェクトを作成/送信する前にデータのチェックを実装する必要がありました(とにかく)。これは他人がこの奇妙なエラーを見るのを助けることを願っています。

1

私はこの奇妙な問題にも直面しました(nvarcharを整数例外に変換する)。

私の解決策では、基になる接続がnullであるとわかった場合、私はtransactonを再構築します。しかし、それは汚い仕事です。

enter image description here

関連する問題