Следующий код выполняет кучу операторов SQL хорошо работает ...Использование параметров в результаты запроса в НАЧАТЬ/COMMIT рассогласования SQLException
// SQL Server 2008 R2
SqlConnection connection = null;
var runBatch = false;
try
{
connection = new SqlConnection(connectionString);
connection.Open();
var command = connection.CreateCommand();
// 1st batch
command.CommandText = "BEGIN TRANSACTION";
command.ExecuteNonQuery;
// 2nd batch
command.CommandText = "UPDATE MyTable SET MyColumn = 'foo' WHERE Name = 'bar'";
command.ExecuteNonQuery;
// 3rd batch
command.CommandText = "COMMIT TRANSACTION";
command.ExecuteNonQuery;
}
finally
{
if (connection != null)
{
connection.Close();
}
}
... если я не использовать параметр:
// [...]
command.Parameters.AddWithValue("name", "bar");
// 1st batch
command.CommandText = "BEGIN TRANSACTION";
command.ExecuteNonQuery; // <= throws Exception
Сообщение об исключении:
Счет транзакции после EXECUTE указывает несоответствующее количество операторов BEGIN и COMMIT. Предыдущее количество = 1, текущее число = 0
Примечание: Это будет работать, если я объединил все операторы в одной команде. Но в мое приложение, оригинальный SQL скрипт кучу пакетов, разделенных GO
, которая автоматически разбивается на несколько команд (так что я не имею никакого контроля над тем, как и какие транзакции используются):
/* Original SQL */
BEGIN TRANSACTION
GO
UPDATE MyTable
SET MyColumn = 'foo'
WHERE NAME = @name
GO
COMMIT TRANSACTION
GO
Я прочитал о это исключение, но на этот особый сценарий ничего не похоже.
Я еще не понял, какая именно разница вводит здесь параметр и почему он нарушает код. Кто-нибудь получил решение для этого?
Где Имя Тран? [MSDN] (https://msdn.microsoft.com/fr-fr/library/ms188929.aspx#Syntaxe) – Sami
это может помочь: http://stackoverflow.com/a/19165433/57475 – Tanner
@Tanner Я не знаю, t действительно контролируют, какие транзакции используются в SQL, см. мое редактирование на вопрос ... – marsze