2012-03-23 54 views
4

我有,我调用存储不同的参数值的程序循环。 下次通话cmd.ExecuteNonQuery(); 我用交易来保存所有或回滚和checkBox2 - 永远保存。 我发现一个问题,我找不到解决方案。 第一个问题出现在catch块被触发时事务对象失去连接。 t.connection为空! 一切都很好,但交易对象是没有在启动它连接的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 2012-03-23 13:09:23

+0

你如何设置你的连接和交易? – Strillo 2012-03-23 13:14:34

+0

我设置了他们:如果(!conn2.State = ConnectionState.Open)conn2.Open(); SqlTransaction t = conn2.BeginTransaction(); – pdusp 2012-03-23 13:17:29

回答

2

遇到类似的问题。在我的情况下,它发生了一个特定的SqlException。大多数异常都会被捕获并处理,但每当我遇到转换错误(例如尝试将字符串转换为数字)时,它都会自动结束事务。

为了解决这个问题,我有(反正好主意)来实现数据校验大厦之前/提交的命令对象。希望这有助于他人看到这个奇怪的错误。

1

我也遇到了这个问题奇(转换为nvarchar到整数除外)。

在我的解决方案,我重建transacton如果发现底层连接为空。但这是一项肮脏的工作。

enter image description here

相关问题