c# - 捕获事务连接后的 SqlTransaction 为空

标签 c# transactions connection try-catch sqltransaction

我有一个循环,我在其中调用具有不同参数值的存储过程。 接下来调用 cmd.ExecuteNonQuery(); 我使用事务来保存全部或回滚,并使用 checkBox2 - 始终保存。 我发现了一个问题,但找不到解决方案。 在触发 catch block 时的第一个问题之后,事务对象失去了连接。 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

最佳答案

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

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

关于c# - 捕获事务连接后的 SqlTransaction 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9839631/

相关文章:

java - 使用 JdbcTemplate 连接到数据库

c# - 引入 FOREIGN KEY 约束...可能会导致循环或多个级联路径 - Entity Framework

c# - 如何设计 Repository 模式以便以后轻松切换到另一个 ORM?

c# - PowerPoint 打印页数

python - 在Django中,如何实现一个事务的可重复读?

java - @Transactional 在 REST 层还是在服务层?哪个更好?

c# - 在枚举中使用特殊字符,例如% (C#3.0)

java - ApplicationContext 的子方法中事务未激活

android - BroadcastReceiver 不会因网络连接更改而触发

java - 在其他对象之间共享 JDBC Connection 对象