“已经是公开的DataReader”异常在ASP.NET嵌套SqlDataReader的(“alre

2019-06-25 02:10发布

我想在下面的代码使用嵌套SqlDataReader的,但我不能让它。我得到“System.InvalidOperationException:有已与此命令必须先关闭相关联的打开的DataReader”的代码。 有什么建议

            c = "select user_Reps.rep_key,Officers.Officer_Name from user_Reps left join Officers on user_Reps.rep_key = Officers.Officer_code where [user_key]="+userCode;
            if (c == null)
                c = sr.ReadToEnd();
            try
            {

                SqlCommand cmd = new SqlCommand(c, cn);
                cn.Open();
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
                SqlDataReader rdr2;
                while (rdr.Read())
                {
                    string c2 = "select Active_Clients.Clients_code,Active_Clients.Clients_Name,Active_Clients.Geo_code  from Active_Clients where Active_Clients.[Officer_code] =" + rdr.GetValue(0) + " order by Clients_Name";
                    SqlCommand cmd2 = new SqlCommand(c2, cn);

                    rdr2 = cmd2.ExecuteReader(CommandBehavior.CloseConnection);


                    Dictionary<string, object> d = new Dictionary<string, object>(rdr.FieldCount+rdr2.FieldCount);
                    while (rdr2.Read())
                    {
                        int i = 0;
                        for (; i < rdr.FieldCount; i++)
                        {
                            d[rdr.GetName(i)] = rdr.GetValue(i);
                        }

                        for (; i < rdr2.FieldCount; i++)
                        {
                            d[rdr2.GetName(i)] = rdr2.GetValue(i);
                        }

                        list.Add(d);
                    }




                    rdr2.Close();

                    //list.Add(d);
                }
                JavaScriptSerializer j = new JavaScriptSerializer();
                Response.Write(j.Serialize(list.ToArray()));

            }

Answer 1:

该错误信息是有点误导。 除非你有MultipleActiveResultSets=True在连接字符串中,你只能有一个活动结果每个连接设置。 这仍是如此,如果每一个读者的帽子它自己独立的SqlCommand对象。



Answer 2:

你不能在同一时间在同一连接上两个开放的DataReader。

这个问题的共同解决办法将是打开下一个之前的DataReader到第一的DataReader的内容加载到一个DataTable或列表<>。 你也可以打开嵌套查询一个新的连接。

编辑或者,如@Mithrandir提到的,你可以使用给这个MultipleActiveResultSets =在连接字符串如此。



Answer 3:

假设它是在2005年或更高,可实现多个活动结果集(MARS),在SQL Server版本应该做的伎俩,我认为。 http://msdn.microsoft.com/en-us/library/h32h3abf%28v=vs.80%29.aspx 。 如果火星上是不是一种选择,不同的连接应为第二个命令打开。



文章来源: “already an open DataReader” exception with nested SqlDataReader in ASP.NET