C # SQL Распределенная транзакция завершена. Либо подключите этот сеанс к новой транзакции, либо к транзакции NULL. - PullRequest
4 голосов
/ 05 октября 2009

Я получаю эту ошибку (Распределенная транзакция завершена. Либо включите этот сеанс в новую транзакцию, либо в транзакцию NULL.) При попытке запустить хранимую процедуру из C # в базе данных SQL Server 2005. Я не активно / целенаправленно использую транзакции или что-то еще, что делает эту ошибку странной. Я могу запустить хранимую процедуру из студии управления, и она отлично работает. Другие хранимые процедуры также работают с C #, просто кажется, что это одна из проблем. Ошибка возвращается немедленно, поэтому она не может быть проблемой тайм-аута. Код выглядит следующим образом:

  SqlCommand cmd = null;
  try
  {
      // Make sure we are connected to the database
      if (_DBManager.CheckConnection())
      {
        cmd = new SqlCommand();

        lock (_DBManager.SqlConnection)
        {
          cmd.CommandText = "storedproc";
          cmd.CommandType = System.Data.CommandType.StoredProcedure;
          cmd.Connection = _DBManager.SqlConnection;

          cmd.Parameters.AddWithValue("@param", value);

          int affRows = cmd.ExecuteNonQuery();

          ...
        }
      }
      else
      {
        ...
      }
  }
  catch (Exception ex)
  {
    ...
  }

Это действительно меня озадачило. Спасибо за любую помощь

Ответы [ 2 ]

4 голосов
/ 05 октября 2009

Звучит так, будто есть где-то несчастный TransactionScope. _DBManager.CheckConnection и _DBManager.SqlConnection звучит так, как будто вы держите SqlConnection, что, как я ожидаю, будет способствовать этому.

Если честно, в большинстве общих случаев вам лучше всего использовать встроенный пул подключений, а using локально - то есть

using(var conn = new SqlConnection(...)) { // or a factory method
    // use it here only
}

Здесь вы получите чистый SqlConnection, который будет сопоставлен с неуправляемым соединением через пул, то есть он не создает фактическое соединение каждый раз (но выполнит логический сброс для очистки это).

Это также позволяет значительно более гибко использовать несколько потоков. Например, использование соединения static в веб-приложении было бы ужасно для блокировки.

0 голосов
/ 05 октября 2009

Из кода кажется, что вы используете уже открытое соединение. Возможно, ранее на том же соединении ожидала транзакция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...