【问题标题】:C# System.InvalidOperationException: The current TransactionScope is already completeC# System.InvalidOperationException:当前 TransactionScope 已经完成
【发布时间】:2018-07-14 21:17:55
【问题描述】:

我在执行我的源代码时遇到了这个错误。但我在互联网上获得的信息似乎并不多。因此,我希望可以从这里的专业人士那里得到一些线索。

源代码

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 已经完成。
在 System.Transactions.Transaction.get_Current()
在 System.Data.ProviderBase.DbConnectionPool.GetFromTransactedPool(事务和事务)
在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,布尔 allowCreate,布尔 onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal& 连接)
在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource
1 重试,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& 连接)
在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection externalConnection,DbConnectionFactory connectionFactory,TaskCompletionSource1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource
1 重试,DbConnectionOptions userOptions)
在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1 重试)
在 System.Data.SqlClient.SqlConnection.Open()

【问题讨论】:

  • 贴一些代码老兄!
  • 您很可能在交易关闭后尝试使用交易,但如果没有相关代码,House MD 将无法诊断异常
  • 我已经用源代码更新了我的帖子。
  • 异常发生在哪一行
  • 调用this.queryrunner.QueryList(sql, param); > OpenConnection(); > this.conn.Open();时抛出异常

标签: c# sql-server exception invalidoperationexception


【解决方案1】:

OpenConnection 这一行有点臭,我猜这就是你的问题所在

try
{
    OpenConnection();
    ...

这样会更有意义

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

这样你就强迫自己控制连接生命周期,而不是试图变得棘手,然后在另一个上下文中猜测它

如果你把它写成using 声明实际上会更好,但我不是 确定您正在使用的框架和/或语法

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    相关资源
    最近更新 更多