在查询中使用参数会导致BEGIN / COMMIT mismatch SQLException

本文关键字:BEGIN COMMIT SQLException mismatch 查询 参数 | 更新日期: 2023-09-27 18:14:46

下面的代码执行一堆SQL语句工作得很好…

// 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后的Transaction count表示BEGIN和COMMIT语句的数目不匹配。前一个计数= 1,当前计数= 0

注意:如果我将所有语句合并到一个命令中,这将工作。但在我的应用程序中,原始的SQL脚本是一堆由GO自动分割成多个命令的批次(所以我无法控制如何或使用什么事务):

/* Original SQL */
BEGIN TRANSACTION
GO
UPDATE MyTable
SET MyColumn = 'foo'
WHERE NAME = @name
GO
COMMIT TRANSACTION
GO

我读过关于这个例外的文章,但是似乎没有什么能真正适用于这个特殊的场景。

我还没有弄清楚在这里引入参数有什么确切的区别,以及为什么它会破坏代码。有人能解决这个问题吗?

在查询中使用参数会导致BEGIN / COMMIT mismatch 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 = @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();
    }
}