请问一个困饶我好久的Connetion关闭的问题!

hjl425 2006-04-22 10:25:35
我把所有对数据库的操作都封装到了一个类中,写程序时就直接调用这个类的某个函数来返回结果!

下面是一个用来返回DataReader对象的通用类,
public SqlDataReader GetReader(string SQL)
{
SqlConnection Conn;
Conn = new SqlConnection(strConn);
Conn.Open();
SqlCommand Cmd ;
Cmd = CreateCmd(SQL, Conn);
SqlDataReader dr;
try
{
dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch
{
throw new Exception(SQL);
}
Cmd.Dispose();
return dr;
}



在程序在需要的时候我就直接构造好SQL语句,调用这个函数即可,如下:

string sql="select * form student";

SqlDataReader dr = mydate.GetReader(sql);//调用数据库操作通用类中的GetReader函数,返回SqlDataReader

if(dr.Read())
{
.........读出数据,赋值给页面控件.....
}
dr.Close();//操作完毕,关闭DataReader



我按照这样的写基本已经没问题了,可以正常读取出数据,但是我现在担心的一个问题是Connection对象的关闭问题,因为是在函数中建立的Connection对象,没办法在外部来关闭它,又不能在函数中关闭,如果在函数中就关闭了会提示‘阅读器关闭时Read的尝试无效’

但我在函数中就用了这一行:dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中对CommandBehavior.CloseConnection的解释是‘在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。’

也就是说我在关闭了DataReader之后,关联的Connection会自动关闭,我也测试过,测试代码如下:

string strConn = ConfigurationSettings.AppSettings["SqlDatabase"];
SqlConnection cn=new SqlConnection(strConn);
cn.Open();
string sql="select * form student";
SqlCommand cm=new SqlCommand(sql,cn);
SqlDataReader dr=cm.ExecuteReader(CommandBehavior.CloseConnection);
SqlDataReader dr = mydate.RunProcGetReader(sql);
if(dr.Read())
{
.......读取数据
}
dr.Close();//关闭DataReader
Response.Write(cn.State);//输出Connetion的状态

结果运行这一段,输出:Closed ,可见Connetion确实自动关闭了!但是如我在上面所说,我的Coonection是在函数在建立的,在函数中执行操作然后返回DataReader,然后在外面读出数据,读取完毕后在外部关闭DataReader,这样函数中的Connetion会自动关闭吗?
...全文
286 30 点赞 打赏 收藏 举报
写回复
30 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hjl425 2006-05-13
好了,我现在用一个函数来建立Connction,在外部来关闭Connction和DataReader,这样就没问题了,只是每次都要多两行代码!
  • 打赏
  • 举报
回复
hjl425 2006-05-11
caobob:

我要根据一个ID值,来取出某个用户的所有信息,请问如果不用DataReader用什么?还有什么比这更好吗?

还有我还要判断这个用户是否存在,如果存在则取出信息,不存在则输出错误!想来想去也只有用DataReader最好!
  • 打赏
  • 举报
回复
hackencn 2006-05-11
用foreach语句试试啊
  • 打赏
  • 举报
回复
caobob 2006-05-11
问题是你为什么要返回一个datareader.它的存在必须是数据库连接的状态.
  • 打赏
  • 举报
回复
baiyashan 2006-05-11
帮顶给我分吗?我快升级了.
  • 打赏
  • 举报
回复
szc21 2006-05-11
顶一下,用table方法我见过,就是在你写 SqlDataReader的函数里面定义一个table,然后吧DR里面的值取出来赋予table里面,这个函数要返回table而不是DR,在函数里面你就可以吧CON和DR关闭了,不影响输出 table.
  • 打赏
  • 举报
回复
qiongfei 2006-05-11
用sqlhelper么好了
  • 打赏
  • 举报
回复
hjl425 2006-05-11
还是不能确定这种类型的操作Connction会不会自动关闭!

回楼上的,因为Connction是写在函数中的,所以我也没办法来输出它的状态!
  • 打赏
  • 举报
回复
xiaomatian 2006-05-03
要关闭就写个函数判断一下啊
conn.State.toString()有Opend,Close还有没有其他状态没试过
  • 打赏
  • 举报
回复
ypzhenxp 2006-05-03
祝大家五一快乐,顶者送分
http://community.csdn.net/Expert/topic/4728/4728200.xml?temp=.3072931
  • 打赏
  • 举报
回复
ypzhenxp 2006-05-03
学习了

  • 打赏
  • 举报
回复
hjl425 2006-05-03
可是如果Connection不关闭的话会阻塞服务器啊,长期占着服务器资源不释放,如果同时在线人数过多或者访问量比较大的话服务器会承受不了的!

那么我想知道当执行Close的时候Connection是怎么关闭的?物理上的链接依然保存的?是吗?
  • 打赏
  • 举报
回复
ddvddvddv 2006-04-27
首先你应该了解一下连接池的概念。

CommandBehavior.CloseConnection‘在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭!

这句话是对的。可以判断Conn的状态来得知。

但是连接池可能会保持这个连接一段事件。也就是说物理上还是连接的。

其实就编程的实用角度来说,它的关闭与否,作为Coder不要刻意的去关注!!
只要程序运行正确就OK!

  • 打赏
  • 举报
回复
hjl425 2006-04-25
这么说还是不行了,这样也不会关闭,可以微软的MSDN中明明说:执行CommandBehavior.CloseConnection‘在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭!

真是不懂


HAVENT(♂夜雨流星♂):你说的方法二:方式二,将快取的数据在该类中写入到一个DataTable中,然后关闭连接,返回这个DataTable即可 ,听起来似乎还不错,能告诉具体该怎么操作吗?谢谢!
  • 打赏
  • 举报
回复
caobob 2006-04-24
DataReader对象是不会自动关闭的.它是一个数据流的概念,始终是占着数据库的.关闭时必须用Close方法.楼上方法一,新建一个关闭的方法也不好.因为它的DataReader是在方法中生成的.做个Static对象再用方法一才行.
  • 打赏
  • 举报
回复
artoksxb 2006-04-24
up
  • 打赏
  • 举报
回复
HAVENT 2006-04-24
DataReader打开的连接是不会自动关闭的,不过连接池应该可以定时回收一些不活动的连接

采用DateReader读取数据我采用了两种方式

方式一,在这个数据库操作类中添加一个公开方法,用于关闭连接

方式二,将快取的数据在该类中写入到一个DataTable中,然后关闭连接,返回这个DataTable即可

以前我是采用方法一,现在采用方法二,方法二的优势就在于占用的数据库资源大大减少了,而且更加体现了面向对象的思维方式
  • 打赏
  • 举报
回复
hjl425 2006-04-24
我想知道,这个操作到底会不会关闭掉Connetion?
  • 打赏
  • 举报
回复
webwait 2006-04-23
sp1234(面向类型编程不等于面向对象编程,很容易偷换概念!)
===
学习
  • 打赏
  • 举报
回复
longhorn008 2006-04-23
MARK
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
.NET社区
加入

5.9w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2006-04-22 10:25
社区公告
暂无公告