4

使用像这样的构造时,我可以避免打开 DataReader 异常(“已经有一个打开的 DataReader 与此命令关联,必须先关闭。”)?

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
        {
        }
    }
}

此致

4

2 回答 2

3

您可以使用本地连接(即方法的本地连接);使用连接池,将连接保留为字段的优势是微乎其微的,并且经常会引起这种类型的……乐趣。当然,如果您正在编辑数据,您可能会遇到阻止自己的问题——也许使用TransactionScope. 示例在底部...

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

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;
}
于 2009-09-01T11:40:28.693 回答
-2

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

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...
}

这不仅避免了这个问题,而且还产生了更少的开销,因为您只创建 1 command/reader而不是 2。(这假设您的方法调用是同步的。)

另外,考虑使用强类型变量而不是var关键字;var引入以支持匿名类型,仅在必要时才应使用。

于 2009-09-01T11:50:00.203 回答