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