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楼的方式
------解决思路----------------------
正常是这两个DataAccess是要拆分成两个方法的,自己只做自己的事情,然后如何组合什么的是由业务层来组织的,这样才能让每个方法关心的事情最小化,从而达到最大的可复用性
读取到List里面,然后循环list,再读相关数据,这会容易搞混?
------解决思路----------------------
嵌套读可以,但是读完上面的时候你要再读,这时你要释放掉你上面已经打开的了SqlDataReader,才可以再打开一个新的,这时候如果你还想要定位到下次打开的位置,那么你还要记录读到的位置,下次读的时候定位到上次读的地方继续读,不过每次读下个之前都要释放到上个,这是十分耗资源的,多读的话,不推荐这种方法!还是建议用循环记录方法!
------解决思路----------------------
兄弟,SQL语句使用多表连接吧。。。。。。
------解决思路----------------------
最好别这样写,一个对象出现一次也是个好习惯吧,我猜滴
