2016-10-25 2 views
0

Следующий код выполняет кучу операторов 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 

Я прочитал о это исключение, но на этот особый сценарий ничего не похоже.

Я еще не понял, какая именно разница вводит здесь параметр и почему он нарушает код. Кто-нибудь получил решение для этого?

+0

Где Имя Тран? [MSDN] (https://msdn.microsoft.com/fr-fr/library/ms188929.aspx#Syntaxe) – Sami

+0

это может помочь: http://stackoverflow.com/a/19165433/57475 – Tanner

+0

@Tanner Я не знаю, t действительно контролируют, какие транзакции используются в SQL, см. мое редактирование на вопрос ... – marsze

ответ

0

Попробуйте это:

// 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 = @name"; 
    command.Parameters.AddWithValue("name", "bar"); 
    command.ExecuteNonQuery(); 

    // 3rd batch 
    command.CommandText = "COMMIT TRANSACTION"; 
    command.Parameters.Clear(); 
    command.ExecuteNonQuery(); 
} 
finally 
{ 
    if (connection != null) 
    { 
     connection.Close(); 
    } 
} 
+0

Это может сработать, но это действительно просто обходное решение, а не объяснение этого поведения. Кроме того, на самом деле я не буду знать, какой пакет будет нуждаться в параметрах, и который сломается, если я добавлю. – marsze

+0

Я предполагаю, что это причина command.ExecuteNonQuery(). Если вы объявите параметры, у которых нет параметров, вы получите эту ошибку. – CesarKM