使用SqlConnection打开DataReader错误

时间:2011-06-08 04:03:17

标签: c# .net sql sql-server sql-server-2005

在我的项目中,我有一个从Sql2005 Server检索数据的功能 像这样,

SqlConnection sqlCnn = new SqlConnection("");
SqlCommand sqlCmd = new SqlCommand("Select user_id from users");
SqlDataReader sqlReader = null;

sqlCnn.Open();
sqlCmd.Connection = sqlCnn;
sqlReader = sqlCmd.ExecuteReader();

if (sqlReader.HasRows)
{
    while (sqlReader.Read())
    {
        if(user_id == 1)
        {
            SqlCommand sqlCmd2 = new SqlCommand("Select mobile from tbl");
            sqlCmd2.Connection = sqlCnn;
            sqlCmd2.ExecuteReader();
        }
    }
}

执行sqlcmd2时出现以下错误。

  

已经有一个开放的DataReader   与此命令相关联   必须先关闭。

我不想在那里创建一个新的sqlconnection。有什么方法可以解决 这个问题?

4 个答案:

答案 0 :(得分:3)

要为每个连接打开两个阅读器,您需要启用MARS(多个活动结果集)。 您可以通过连接字符串执行此操作:

 Server=myServerAddress;Database=myDataBase;Trusted_Connection=True; MultipleActiveResultSets=true;

但是,不建议采用这种方法 我确信您可以通过一个查询检索所需的数据。

如果您需要,您需要解释需要检索的内容,并提供单个查询的建议 我认为你展示的代码只是一个样本,而不是一个真实的代码,因为它没有多大意义。

看看'MARS是一个好消息,还是有任何不利因素?'第here.部分

答案 1 :(得分:3)

解决此问题的最佳方法是在数据库中将两个表连接在一起。这应该会给你至少一个数量级的性能提升,特别是如果在适当的列上有一个索引。

数据结构不会进入此状态;这就是你如何订购结果以及如何阅读它们的全部内容。如果操作正确,您可以将其读入任何可以想象的数据结构中。

但是,如果这不是一个选项,请确保您至少使用Sql Server 2005并将MultipleActiveResultSets=true添加到您的连接字符串。

当您使用它时,您的现有代码会被破坏并最终导致您的数据库不可用,因为在发生异常的情况下您无法保证关闭您的连接。要解决此问题,请在using块中创建SqlConnection对象。

答案 2 :(得分:1)

如果您不能创建第二个SQL连接,则可以启用MARS(多个活动结果集)。

为什么不想要第二次连接?

答案 3 :(得分:0)

在.net 4中,你不需要检查hasrows条件。 Reader.Read()方法根据表内容返回true / false。刚用空表检查。工作!