0

我收到一个错误

已经有一个与此命令关联的打开的 DataReader,必须先关闭它。

当我SqlDataReader在另一个中使用 a 时SqlDataReader。我不知道我在哪里犯了错误,如何解决?执行第二个数据读取器 (dr2) 时出现错误。

{
    cmd = new SqlCommand("select agent,comm,primm from comm where a_id = '" + textBox1.Text + "' AND date >= @date1 AND date <= @date2 ", agr);

    cmd.Parameters.AddWithValue("@date1", dateTimePicker1.Value);
    cmd.Parameters.AddWithValue("@date2", dateTimePicker2.Value);
    dr = cmd.ExecuteReader();

    while (dr.Read())
    {      
        aid = dr[0].ToString().Trim();
        comm = double.Parse(dr[1].ToString());
        busi = double.Parse(dr[2].ToString());

        cmd2 = new SqlCommand("select s_id,lvl from agnt where a_id = @a_id", agr);
        cmd2.Parameters.AddWithValue("@a_id", aid);

        // on this line get executed I get a message 
        // There is already an open DataReader associated with this 
        // Command which must be closed first.
        dr2 = cmd2.ExecuteReader();         

        if(dr2.Read())
        {
            abc = dr2[0].Tostring();
        }                  
        dr2.Close();
    }

    dr.Close();
    cmd.Parameters.Clear();
}
4

3 回答 3

3

当您打开 DataReader 时,该连接由 DataReader 独占使用,不能用于执行其他命令(SqlCommand.ExecuteNonQuerySqlDataAdapter)。请参阅SqlDataReader 上的 MSDN 参考上
的备注部分。
您需要在连接字符串中添加MultipleActiveResultSets=True以克服此限制

MSDN上的这篇文章解释了这个问题的细节

作为不相关的说明,请避免使用字符串连接来构建命令文本。您已经在使用参数,那么为什么只为一个值切换到字符串 concat 呢?

cmd = new SqlCommand("select agent,comm,primm from comm " + 
         "where a_id = @id AND date >= @date1 AND date <= @date2 ", agr);

cmd.Parameters.AddWithValue("@id", textBox1.Text);
cmd.Parameters.AddWithValue("@date1", dateTimePicker1.Value);
cmd.Parameters.AddWithValue("@date2", dateTimePicker2.Value);
dr = cmd.ExecuteReader();
于 2013-08-08T10:38:02.473 回答
1

四种固定方法是:

  1. 看看@Steve 的回答
  2. 为第二个数据读取器创建新连接
  3. 存储来自第一个阅读器的数据,然后用第二个阅读器填充
  4. 结合您的查询:

    select c.agent, c.comm, c.primm, a.s_id, a.lvl
    from comm c
    left join agnt a on a.a_id = c.agent
    where a_id = @a_id AND date >= @date1 AND date <= @date2
    

这个不需要两个阅读器来从数据库中检索所有数据。

于 2013-08-08T10:40:50.700 回答
0

afaik,两个数据读取器不能同时使用单个连接。您需要为每个命令创建连接或在关闭第一个阅读器后使用第二个阅读器。

于 2013-08-08T10:37:29.870 回答