代码之家  ›  专栏  ›  技术社区  ›  Oliver Hanappi

使用嵌套命令时是否可以避免OpenDataReader异常?

  •  4
  • Oliver Hanappi  · 技术社区  · 16 年前

    在使用类似这样的构造时,我是否可以避免OpenDataReader异常(“已经有一个OpenDataReader与此命令关联,必须先关闭它”)?

    public void FirstMethod()
    {
        using (var command = connection.CreateCommand())
        {
            command.CommandText = "...";
            using (var reader = command.ExecuteReader())
            {
                // do something with the data
                SecondMethod();
            }
        }
    }
    
    public void SecondMethod()
    {
        using (var command = connection.CreateCommand())
        {
            command.CommandText = "...";
            using (var reader = command.ExecuteReader()) // Exception
            {
            }
        }
    }
    

    顺致敬意,

    2 回复  |  直到 16 年前
        1
  •  3
  •   Marc Gravell    16 年前

    您可以使用本地连接(即方法的本地连接);使用连接池,将连接保持为字段的好处是最小的,并且经常导致这种类型的。。。享乐当然,如果您正在编辑数据,那么您可能会遇到阻塞自己的问题——也许可以通过以下方式缓解 TransactionScope . 下面的例子。。。

    或者,您可以在连接上启用MARS(多个活动结果集);应该这样做。只需将“MultipleActiveResultSets=True”作为一对包含在连接字符串中(SQLServer2005及更高版本)。

    public void FirstMethod() {
        using (var connection = CreateAndOpenConnection())
        using (var command = connection.CreateCommand()) {
            command.CommandText = "...";
            using (var reader = command.ExecuteReader()) {
                // do something with the data
                SecondMethod();
            }
        }
    }
    public void SecondMethod() {
        using (var connection = CreateAndOpenConnection())
        using (var command = connection.CreateCommand()) {
            command.CommandText = "...";
            using (var reader = command.ExecuteReader()) // Exception
            { }
        }
    }
    private SqlConnection CreateAndOpenConnection() {
        var conn = new SqlConnection(connectionString);
        conn.Open(); // perhaps dispose if this fails...
        return conn;
    }
    
        2
  •  -2
  •   Ian Kemp    16 年前

    你为什么不改变你的方法签名呢?

    public void FirstMethod()
    {
        using (var command = connection.CreateCommand())
        {
            command.CommandText = "...";
            using (var reader = command.ExecuteReader())
            {
                // do something with the data
                SecondMethod(reader);
            }
        }
    }
    
    public void SecondMethod(var reader)
    {
        // do stuff with reader...
    }
    

    command / reader

    此外,考虑使用强类型变量而不是 var 关键词; 变量 是为了支持匿名类型而引入的,应仅在必要时使用。