none
Как использовать IDbTransaction MSSQL и C# RRS feed

  • Вопрос

  • Добрый день.

    Задача: Последовательно обновить связанные таблицы в базе данных. В случае, если возникает проблема при обновлении одной из таблиц, нужно откатить уже до этого обновленные таблицы.

    Проблема: Создается исключение при попытке выполнить обновление тут (sqlCommandInsertTblName.ExecuteNonQuery();):

    Исключение: ExecuteReader требует, чтобы команда имела транзакцию, если подключение, назначенное команде, находится в отложенной локальной транзакции Свойство Transaction для команды не инициализировано.

    Весь код:

            protected void Page_Load(object sender, EventArgs e)

            {

    ……

     

                SqlCommand sqlCommandInsertTblName = new SqlCommand("insert into tblName (NameID,NickName) Values (@NameID,@NickName)", sConn);

                sqlCommandInsertTblName.Parameters.Add("@NameID", SqlDbType.Int);

                sqlCommandInsertTblName.Parameters["@NameID"].SourceColumn = "NameID";

                sqlCommandInsertTblName.Parameters.Add("@NickName", SqlDbType.NVarChar);

                sqlCommandInsertTblName.Parameters["@NickName"].SourceColumn = "NickName";

     

                sqlDataAdapterSelectTblName.InsertCommand = sqlCommandInsertTblName;

                sConn.Open();

                IDbTransaction trans = sConn.BeginTransaction();

                try

                {

                    sqlCommandInsertTblName.ExecuteNonQuery();

                    trans.Commit();

     

                }

                catch (Exception ex)

                {

                    trans.Rollback();

                    sConn.Close();

                    Response.Write("400\r\nError while update");

                    return;

                }

                sConn.Close();

    }

     

    Вопрос: Что делаю не так? И как это исправить?

    Заранее благодарен.

     

    • Изменено EgoZa 19 октября 2010 г. 8:47
    18 октября 2010 г. 14:56

Ответы

  • Насколько я понимаю, нужно ассоциировать транзакцию с SqlCommand. Попробуй как-нибудь так:

          sConn.Open();
          sqlCommandInsertTblName.Transaction trans = sConn.BeginTransaction();
          try
          {
            sqlCommandInsertTblName.ExecuteNonQuery();
            sqlCommandInsertTblName.Transaction.Commit();
          }
          catch (Exception ex)
          {
            sqlCommandInsertTblName.Transaction.Rollback();
            Response.Write("400\r\nError while update");
          }
          finally
          {
             sConn.Close();
          }
    
          
    

    • Помечено в качестве ответа EgoZa 19 октября 2010 г. 7:59
    18 октября 2010 г. 19:17
    Модератор

Все ответы

  • Насколько я понимаю, нужно ассоциировать транзакцию с SqlCommand. Попробуй как-нибудь так:

          sConn.Open();
          sqlCommandInsertTblName.Transaction trans = sConn.BeginTransaction();
          try
          {
            sqlCommandInsertTblName.ExecuteNonQuery();
            sqlCommandInsertTblName.Transaction.Commit();
          }
          catch (Exception ex)
          {
            sqlCommandInsertTblName.Transaction.Rollback();
            Response.Write("400\r\nError while update");
          }
          finally
          {
             sConn.Close();
          }
    
          
    

    • Помечено в качестве ответа EgoZa 19 октября 2010 г. 7:59
    18 октября 2010 г. 19:17
    Модератор
  • Исключение более не создается, Спасибо!

    19 октября 2010 г. 7:59