ASP.NET中嵌套的SqlDataReader“已经是一个开放的DataReader”exception

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

错误消息有点误导。 除非连接字符串中有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不是选项,则应为第二个命令打开不同的连接。