Подготовка требует, чтобы команда имела транзакциюC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Подготовка требует, чтобы команда имела транзакцию

Сообщение Anonymous »

Я получаю следующую ошибку:


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


В методе подготовки():

Код: Выделить всё

connection = new SqlConnection(dbconnectionstring);
connection.Open();
transaction = connection.BeginTransaction();
SqlCommand Command1 = GetCommand1(connection);
SqlCommand Command2 = GetCommand2(connection, transaction);

private SqlCommand GetCommand1(SqlConnection connection)
{
const string sql = @"
INSERT INTO R_Activity(start_time, activity_num) OUTPUT INSERTED.ID VALUES(SYSDATETIME(), @ACTIVITY_NUM)
";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.Add(new SqlParameter("@ACTIVITY_NUM", System.Data.SqlDbType.Int, 0));
command.Prepare();  // Error here.
return command;
}

private SqlCommand GetCommand2(SqlConnection connection, SqlTransaction transaction)
{
const string sql = @"
INSERT IVS_RUNHISTORY ( r_activity_id, datasource,  rundate)
OUTPUT INSERTED.ID
VALUES (@r_activity_id, @datasource, @rundate)
";
SqlCommand command = new SqlCommand(sql, connection, transaction);

command.Parameters.Add(new SqlParameter("@datasource", System.Data.SqlDbType.Char, 4));
command.Parameters.Add(new SqlParameter("@rundate", System.Data.SqlDbType.DateTime, 0));
command.Parameters.Add(new SqlParameter("@r_activity_id", System.Data.SqlDbType.Int, 0));
command.Prepare();
return command;
}
Как мне избежать этой ошибки?

Моя цель — позволить Command1 выполняться вне транзакции, например что строка будет полностью записана в базу данных сразу после выполнения вставки, а Command2 будет ждать полной записи до вызова Commit().

Разница в команд заключается в том, что Command1 похож на журнал происходящего, а Command2 — это бизнес-логика консольной программы. То есть, даже если бизнес-логика даст сбой, я все равно хочу увидеть лог в базе данных.

Это урезанный пример кода. Существуют и другие команды, которые будут связаны с транзакцией.

[EDIT]
Если я закомментирую функцию Подготовка(), ошибка перенесет выполнение:


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


[EDIT]
Сценарий использования для этого это: у меня есть таблица, которую я хочу обновить и не подвергать откату. Таблица представляет собой журнал того, что делает программа. Я хочу, чтобы журнал оставался неповрежденным, даже если произошел ОТкат.

Подробнее здесь: https://stackoverflow.com/questions/514 ... ransaction
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»