首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET中嵌套的SqlDataReader出现“已打开的DataReader”异常

ASP.NET中嵌套的SqlDataReader出现“已打开的DataReader”异常
EN

Stack Overflow用户
提问于 2012-06-02 00:41:44
回答 3查看 12.5K关注 0票数 5

我想在下面的代码中使用嵌套的SqlDataReader,但是我做不到。我得到了"System.InvalidOperationException:已经有一个打开的DataReader与这个命令相关联,必须先关闭“的代码。有什么建议吗

代码语言:javascript
运行
复制
            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()));

            }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-02 00:45:14

这个错误消息有点误导人。除非连接字符串中包含MultipleActiveResultSets=True,否则每个连接只能有一个活动结果集。如果每个阅读器都拥有自己的独立SqlCommand对象,情况仍然如此。

票数 17
EN

Stack Overflow用户

发布于 2012-06-02 00:46:31

同一连接上不能同时有两个打开的DataReaders。

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

编辑,或者,正如@Mithrandir提到的,您可以在连接字符串上使用MultipleActiveResultSets=true。

票数 5
EN

Stack Overflow用户

发布于 2012-06-02 00:49:18

假设它使用的是sql server版本2005或更高版本,那么我认为启用多个活动结果集(MARS)应该可以做到这一点。http://msdn.microsoft.com/en-us/library/h32h3abf%28v=vs.80%29.aspx。如果不能选择MARS,则应为第二个命令打开不同的连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10854267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档