当前位置: 代码迷 >> C# >> 数据库读取数据,出错
  详细解决方案

数据库读取数据,出错

热度:67   发布时间:2016-05-05 04:25:47.0
数据库读取数据,报错?

using (SqlConnection con = new SqlConnection(SqlString))
{
    con.Open();
    using (SqlCommand CmdTouZhuResult = con.CreateCommand()) 
    {
       ......
       .......
        using (SqlDataReader ReaderTouZhuResult = CmdTouZhuResult.ExecuteReader()) 
        {
            using (SqlCommand CmdSingleData = con.CreateCommand())  
            {
                using (SqlCommand CmdUpdateTouZhuResult = con.CreateCommand()) 
                {
                    while (ReaderTouZhuResult.Read())
                    {
                          .....
                          .....
                            using (SqlDataReader ReaderSingleData = CmdSingleData.ExecuteReader()) 
                            {
                               ......
                            }
                        }
                    }
                }                            
            }                        
        }
    }
}


上面有一段读取数据库数据的代码,在运行的过程中,报错:已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭.....

这是什么意思啊,不能嵌套读取的吗?
------解决思路----------------------
你肯定重复的关联了一个已经打开的DataReader
------解决思路----------------------
使用sqldatareader读取数据后,把con关掉(con.Close()),然后再打开(con.Open())

------解决思路----------------------
看到这一层层的DbCommand,DataReader……我也是醉了
异常已经告诉你了,你开了一个DataReader,不能再开了,必须要把之前的关掉
正常的代码都是下面这个格式的
using (SqlCommand CmdTouZhuResult = con.CreateCommand()) 
    {
        using (SqlDataReader ReaderTouZhuResult = CmdTouZhuResult.ExecuteReader()) 
        {}
     }
//两者分开写,其实command都可以用同一个的,只要改下SqlText,清除DbParameter之类的
using (SqlCommand CmdSingleData = con.CreateCommand())  
            {
                using (SqlCommand CmdUpdateTouZhuResult = con.CreateCommand()) 
                {
                    while (ReaderTouZhuResult.Read())
                    {
                          .....
                          .....
                            using (SqlDataReader ReaderSingleData = CmdSingleData.ExecuteReader()) 
                            {
                               ......
                            }
                        }
                    }
                }                            
            }
 
------解决思路----------------------
con.CreateCommand()    中个方法  你虽然使用了2次,而且使用的using语句,但是只有在using 方法体执行完毕 才能算是释放command的资源。

什么需求要循环读取?怎么不写一个视图或者proc,在数据库中执行 所谓的 “嵌套数据”呢。
------解决思路----------------------
可以使用3楼的方式
------解决思路----------------------
引用:
Quote: 引用:

看到这一层层的DbCommand,DataReader……我也是醉了
异常已经告诉你了,你开了一个DataReader,不能再开了,必须要把之前的关掉
正常的代码都是下面这个格式的
using (SqlCommand CmdTouZhuResult = con.CreateCommand()) 
    {
        using (SqlDataReader ReaderTouZhuResult = CmdTouZhuResult.ExecuteReader()) 
        {}
     }
//两者分开写,其实command都可以用同一个的,只要改下SqlText,清除DbParameter之类的
using (SqlCommand CmdSingleData = con.CreateCommand())  
            {
                using (SqlCommand CmdUpdateTouZhuResult = con.CreateCommand()) 
                {
                    while (ReaderTouZhuResult.Read())
                    {
                          .....
                          .....
                            using (SqlDataReader ReaderSingleData = CmdSingleData.ExecuteReader()) 
                            {
                               ......
                            }
                        }
                    }
                }                            
            }
 

按照你的写法,难道是第一个SqlDataReader,先把数据库数据读取到内存,然后再进行下面的读取和计算啊。这样,容易搞混吧。我的意思,读一条,处理一条呢

正常是这两个DataAccess是要拆分成两个方法的,自己只做自己的事情,然后如何组合什么的是由业务层来组织的,这样才能让每个方法关心的事情最小化,从而达到最大的可复用性

读取到List里面,然后循环list,再读相关数据,这会容易搞混?
------解决思路----------------------
嵌套读可以,但是读完上面的时候你要再读,这时你要释放掉你上面已经打开的了SqlDataReader,才可以再打开一个新的,这时候如果你还想要定位到下次打开的位置,那么你还要记录读到的位置,下次读的时候定位到上次读的地方继续读,不过每次读下个之前都要释放到上个,这是十分耗资源的,多读的话,不推荐这种方法!还是建议用循环记录方法!
------解决思路----------------------
兄弟,SQL语句使用多表连接吧。。。。。。
------解决思路----------------------
最好别这样写,一个对象出现一次也是个好习惯吧,我猜滴
  相关解决方案