===有关Connection的疑问:一个Connection只能打开一个DataReader,贴出代码,请指正=== 我怀疑是不是我用了Static变量所致,因为static限制其为静态变量,这样是不是很不合理? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没错,对于一个connection只能存在一个datareader。 do not use static Connection object, let ADO.NET take care of the pooling To alj(alj) DataReader读取数据需要一个持续的连接你只要保证一个DataReader操作完,并关闭了连接后再使用同一个连接就不会有问题了 对于你的问题:1、一个连接只能使用一个DataReader,因为DataReader不是一次把数据读到本地,而是已类似游标的方式从数据库一次读取一条数据,并且,在Reader读数据的时候,连接不能关闭。2、你的这种方式值的商榷,对于Connection这种资源,你写成static无可厚非,但是你必须得保证使用完毕就关闭连接,免得造成资源的浪费。这里是我答的一个关于连接的问题,你可以看看:http://expert.csdn.net/Expert/topic/1517/1517079.xml?temp=.3955042 你不想要使用静态的Connection直接使用完,连接后close就可以了这时连接并不是真的取消了,而是返回到连接池中了关于连接池参见ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.htm 你的类可以按照下面的建议修改一下:1、对于数据层处理的组件,最好可以封装处理,只留出获取数据的方法。2、另一个值得考虑的问题是采用何种方式传递数据,DataReader是最快但最不好的方法;因为你不能够保证调用者能够释放Reader占用的资源,并且逻辑层和数据层不能做到松散耦合,用DataSet是.Net推荐的方式,但是这种方式太浪费内存,因为DataSet比较庞大,可能它的功能你只需要用到10%;自己来写数据结构是折衷的方案,但是需要编码量比较大,而且需要设计合理的数据结构,来保证效率。3、对于你写的类,建议目前可以把静态的声明都去掉,然后实现IDisposable接口,在Dispose方法里面释放连接,这样可以一定程度上增强你的设计;使用的时候,每次都构造一个新的DB对象来处理。 对于一个connection只能存在一个datareader.打开connection之前先把connection关掉。datareader是需要人工控制connection的开关的。DataSet 可以用连接池,比较方便。connection自动控制public static bool OpenConn() { //如果conn尚未联接,就使用strConn联接数据库 if(conn==null) conn=new SqlConnection(strConn); //如果conn之前已经打开,则直接返回True; if(conn.State==ConnectionState.Open) { conn.Close(); } try { conn.Open(); return true; } catch(SqlException e) { throw(e); } } 如果使用DataSet对象,那么还是否会存在这样的问题呢? 如果是用DataSet的话,它的数据是由DataAdapter 填充进来的,通过查看DbDataAdapter(所有数据库DataAdapter的父类)的Fill方法的源码,可以得知,它也是使用DataReader来读取数据,但是它是一次把所有的数据都读进DataSet的Table中,然后关闭和释放连接,这样数据就由DataSet内部的数据结构来保存了。所以使用DataSet的话,不用考虑这个问题,.Net 都帮你做了。 如果数据简单就用数组保存第一次的DataReader好了,特方便。 当 DataReader 打开时,该 DataReader 将以独占方式使用 Connection。在初始 DataReader 关闭之前,将无法对 Connection 执行任何命令(包括创建另一个 DataReader)。 你可以CommandText中写多条sql语句如SqlCommand cm=new SqlCommand("select * from table1 select * from table2")SqlDataReader dr=cm.ExecuteReader();while(dr.read()){ //返回 select * from table1 的结果集....}dr.NextResult()while(de.read()){ //返回 select * from table2 的结果集...} 博客相册案例 WEB中的application与WEB中的上下文有何联系和区别?! asp.net 调用dll 组件 的问题 Reapter控件呈现数据问题~~ 定义了一个SESSION 在装配件(.dll文件)中定义函数的问题! 回傳值的問題,請幫忙 请问如何oledbdataread一条一条的读数据呀! 请问各位:XML和XSD在编程时用的多不多? 想要分的进来,asp转asp.net(c#) FormatCurrency在c#中用什么了! 50分!!!超难的用户控件问题,已经好多天了都没解决!
DataReader读取数据需要一个持续的连接
你只要保证一个DataReader操作完,并关闭了连接后
再使用同一个连接就不会有问题了
1、一个连接只能使用一个DataReader,因为DataReader不是一次把数据读到本地,而是已类似游标的方式从数据库一次读取一条数据,并且,在Reader读数据的时候,连接不能关闭。
2、你的这种方式值的商榷,对于Connection这种资源,你写成static无可厚非,但是你必须得保证使用完毕就关闭连接,免得造成资源的浪费。这里是我答的一个关于连接的问题,你可以看看:
http://expert.csdn.net/Expert/topic/1517/1517079.xml?temp=.3955042
直接使用完,连接后close就可以了
这时连接并不是真的取消了,而是返回到连接池中了
关于连接池参见
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.htm
2、另一个值得考虑的问题是采用何种方式传递数据,DataReader是最快但最不好的方法;因为你不能够保证调用者能够释放Reader占用的资源,并且逻辑层和数据层不能做到松散耦合,用DataSet是.Net推荐的方式,但是这种方式太浪费内存,因为DataSet比较庞大,可能它的功能你只需要用到10%;自己来写数据结构是折衷的方案,但是需要编码量比较大,而且需要设计合理的数据结构,来保证效率。
3、对于你写的类,建议目前可以把静态的声明都去掉,然后实现IDisposable接口,在Dispose方法里面释放连接,这样可以一定程度上增强你的设计;使用的时候,每次都构造一个新的DB对象来处理。
打开connection之前先把connection关掉。
datareader是需要人工控制connection的开关的。
DataSet 可以用连接池,比较方便。connection自动控制
public static bool OpenConn()
{
//如果conn尚未联接,就使用strConn联接数据库
if(conn==null) conn=new SqlConnection(strConn); //如果conn之前已经打开,则直接返回True;
if(conn.State==ConnectionState.Open)
{
conn.Close();
}
try
{
conn.Open();
return true;
}
catch(SqlException e)
{
throw(e);
}
}
如
SqlCommand cm=new SqlCommand("select * from table1 select * from table2")
SqlDataReader dr=cm.ExecuteReader();
while(dr.read())
{ //返回 select * from table1 的结果集
....
}
dr.NextResult()
while(de.read())
{ //返回 select * from table2 的结果集
...
}