C# System.InvalidOperationException: 当前的TransactionScope已经完成

5
我在执行源代码时遇到了这个错误。但是我在互联网上似乎没有找到太多信息。因此,我希望从这里的专业人士那里得到一些线索。
源代码:
public List<string> GetData (List<long> Id)
{
    List<string> data;
    string sql = "select * from tblSample with(nolock) where SampleId in @sampleId";
    Dapper.DynamicParameters param = new Dapper.DynamicParameters();
    param.Add("@sampleId", Id);

    try
    {
        data = this.queryrunner.QueryList(sql, param);
    }
    catch (Exception ex)
    {
        logger.Error(ex.Message, ex);
    }

    return data;
}

QueryRunner类的方法

    private void OpenConnection()
    {
        if (this.conn.State != ConnectionState.Open)
        {
            this.conn.Open();
        }
    }

    public List<t> QueryList(String sql, DynamicParameters param)
    {
        List<t> t;

        try
        {
            OpenConnection();
            t = this.conn.Query<t>(sql, param).ToList();
        }
        catch (System.Data.SqlClient.SqlException ex)
        {
            logger.Debug(ex.Message, ex);
            LogSqlErrorException(this.conn.Database, sql, param);
            throw;
        }
        finally
        {
            CloseConnection();
        }

        return t;
    }

以下是部分错误日志:

System.InvalidOperationException: 当前的 TransactionScope 已经完成。
at System.Transactions.Transaction.get_Current()
at System.Data.ProviderBase.DbConnectionPool.GetFromTransactedPool(Transaction& transaction)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource
1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource
1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1 retry)
at System.Data.SqlClient.SqlConnection.Open()

该错误日志显示当前的 TransactionScope 已经完成,导致连接池无法获取连接。可能的原因是在事务范围内使用了多个数据库连接,或者没有正确地释放连接。请检查代码并确保在使用完连接后正确地关闭和释放它们。

发一些代码吧,伙计! - Sajeetharan
1
很可能您正在尝试在事务关闭后使用它,但是如果没有相关代码片段,House MD 将无法诊断异常。 - Traveler
异常发生在哪一行? - Sujit.Warrier
当调用 this.queryrunner.QueryList(sql, param); > OpenConnection(); > this.conn.Open(); 时抛出异常。 - JackyLoo
每次进行 QueryList 查询时,您应该打开一个新的连接并将其处理掉。让连接池来完成重复使用的繁重工作。 - pmcilreavy
显示剩余2条评论
1个回答

2

这行代码 OpenConnection 有点问题,我猜测这可能是你的问题所在。

try
{
    OpenConnection();
    ...

更有意义的做法是

try
{
    //OpenConnection();
    conn.Open();
    queryrunner.QueryList(sql, param)
}
finally
{
    //CloseConnection();
    conn.Close();
}

通过这种方式,您可以强制自己控制连接的生命周期,而不是在另一个上下文中尝试狡猾地猜测它。

如果您使用using语句,实际上会更好,但我不确定您正在使用哪个框架和/或语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接