【问题标题】:SqlTransaction after catch transaction connection is null捕获事务连接后的 SqlTransaction 为空
【发布时间】:2015-04-25 16:31:07
【问题描述】:

我有一个循环,我用不同的参数值调用存储过程。 下一个电话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();
        }

【问题讨论】:

  • 您在该块中缺少大量代码。我想说你的第一步是稍微简化一下并发布整个块。另外,我会考虑不将大括号放在自己的行上;扫描包含大量空白的大块代码更加困难。 (但这是我的看法)
  • 如何设置连接和事务?
  • 我设置了它们: if (conn2.State != ConnectionState.Open) conn2.Open(); SqlTransaction t= conn2.BeginTransaction();
  • 很难知道从哪里开始,您是否有一个目标是打破几乎所有编写体面代码的规则作为设计要求?第一个问题是你不尝试捕捉任何东西。第二个是如果你这样做了,你不会假设可能会抛出哪个异常。分解代码,以便您查看发生了什么,并且只捕获您可以处理的异常。
  • 问题很简单。当 catch 发生时,对象 Transaction t 丢失了它的 Connection 值。

标签: c# transactions connection try-catch sqltransaction


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多