“已经是一个打开的 DataReader”异常,ASP.NET 中嵌套了 SqlDataReader

本文关键字:异常 DataReader ASP NET SqlDataReader 嵌套 一个 | 更新日期: 2023-09-27 18:35:59

我想在下面的代码中使用嵌套的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()));
            }

“已经是一个打开的 DataReader”异常,ASP.NET 中嵌套了 SqlDataReader

错误消息有点误导。除非连接字符串中有MultipleActiveResultSets=True,否则每个连接只能有一个活动结果集。情况仍然如此,如果每个读者都戴上帽子,它就是自己单独的 SqlCommand 对象。

不能在同一连接上同时打开两个 DataReader。

此问题的常见解决方案是在打开下一个 DataReader 之前将第一个 DataReader 的内容加载到 DataTable 或 List 中<>然后再打开。 还可以为嵌套查询打开新连接。

编辑 或者,如@Mithrandir所述,可以在连接字符串上使用 MultipleActiveResultSets=true。

假设它位于 sql Server 版本 2005 或更高版本上,我认为启用多个活动结果集 (MARS) 应该可以解决问题。 http://msdn.microsoft.com/en-us/library/h32h3abf%28v=vs.80%29.aspx。如果 MARS 不是一个选项,则应为第二个命令打开不同的连接。