首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C# System.InvalidOperationException:当前TransactionScope已完成

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

Stack Overflow用户
提问于 2018-02-05 11:18:06
回答 1查看 3.8K关注 0票数 4

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

源代码

代码语言:javascript
复制
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类方法

代码语言:javascript
复制
    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(Transaction&交易中)

at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,Boolean allowCreate,Boolean onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal& connection)

在System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)

at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource1重试、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, TaskCompletionSource1重试,DbConnectionOptions userOptions)

在System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry)

at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1重试)

在System.Data.SqlClient.SqlConnection.Open()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-05 12:10:13

这行OpenConnection有点难闻,我猜这就是您的问题所在

代码语言:javascript
复制
try
{
    OpenConnection();
    ...

这样做会更有意义

代码语言:javascript
复制
try
{
    //OpenConnection();
    conn.Open();
    queryrunner.QueryList(sql, param)
}
finally
{
    //CloseConnection();
    conn.Close();
}

通过这种方式,您可以强迫自己控制连接生命周期,而不是试图变得棘手,并在另一个上下文中猜测它

如果你把它放在一个using语句中实际上会更好,但是我不确定你正在使用的框架和/或语法

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48615425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档