C# 捕获事务连接后的SqlTransaction为null

C# 捕获事务连接后的SqlTransaction为null,c#,transactions,connection,try-catch,sqltransaction,C#,Transactions,Connection,Try Catch,Sqltransaction,我有一个循环,用不同的参数值调用存储过程。 下一个调用cmd.ExecuteNonQuery() 我使用事务保存全部或回滚,并选中复选框2-始终保存。 我发现了一个问题,却找不到解决办法。 在触发catch块的第一个问题之后,事务对象失去了连接。 t.连接为空! 一切都很好,但事务对象在开始时没有连接 遇到了类似的问题。在我的例子中,它发生在一个特定的SqlException中。大多数异常都会被捕获并得到很好的处理,但每当我出现转换错误(例如试图将字符串转换为数字)时,它就会自动结束事务 为了解

我有一个循环,用不同的参数值调用存储过程。 下一个调用
cmd.ExecuteNonQuery()
我使用事务保存全部或回滚,并选中复选框2-始终保存。
我发现了一个问题,却找不到解决办法。
在触发catch块的第一个问题之后,事务对象失去了连接。
t.连接
为空! 一切都很好,但事务对象在开始时没有连接


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


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

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

在我的解决方案中,如果发现基础连接为null,我将重建Transaction。但这是一件肮脏的工作


该块中缺少大量代码。我想说,你的第一步是将它简化一点,然后发布整个区块。我也会考虑不要在自己的线路上安装支架。扫描一大块有这么多空白的代码是很困难的。(但这是我的观点)如何设置连接和事务?我设置它们:if(conn2.State!=ConnectionState.Open)conn2.Open();SqlTransaction t=conn2.BeginTransaction();很难知道从哪里开始,您是否有一个目标,即打破几乎所有作为设计要求编写体面代码的规则?第一个问题是你什么都不想抓。第二个是,如果您这样做了,您就不会假设可能抛出了哪个异常。将代码分解,这样您就可以看到发生了什么,并且只捕获您可以处理的异常。问题很简单。对象事务t在捕获发生时丢失其连接值。
    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();
        }