catch事务连接后的SqlTransaction为null

时间:2012-03-23 12:58:23

标签: c# transactions connection try-catch sqltransaction

我有一个循环,我用不同的参数值调用存储过程。 下一个电话cmd.ExecuteNonQuery(); 我使用事务来保存所有或回滚,并使用checkBox2 - 始终保存。 我发现了一个问题,我找不到解决方案。 遇到catch块之后的第一个问题,事务对象失去连接。 t.connection为空! 一切都很好,但事务对象在启动时没有连接

    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

2 个答案:

答案 0 :(得分:2)

陷入类似的问题。就我而言,它发生在特定的SqlException上。大多数异常都会被捕获并处理得很好,但每当我遇到转换错误(例如尝试将字符串转换为数字)时,它都会自动结束事务。

要解决这个问题,我必须在构建/提交命令对象之前实现数据检查(无论如何都是好主意)。希望这有助于其他人看到这个奇怪的错误。

答案 1 :(得分:1)

我也遇到了这个奇怪的问题(将nvarchar转换为整数异常)。

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

enter image description here