asp.net中SqlDataReader使用时关闭数据库连接的问题(转)
2012-05-23 11:20
1241 查看
本文解释使用SqlDataReader关闭数据库连接的问题:
例如把数据库的操作都封装到了一个类中,但SqlDataReader只有在读取完毕时才能关闭数据库,这样类中就不能关闭书库库连接。在函数中关闭,如果在函数中就关闭了会提示‘阅读器关闭时Read的尝试无效’ .
这点微软当然想到了。用着个方法dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中对 CommandBehavior.CloseConnection的解释是‘在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。’
但。。。。。,请看下面的问题:
在函数中执行操作然后返回DataReader,然后在外面读出数据,读取完毕后在外部关闭DataReader,这样函数中的Connetion会自动关闭吗?
实例展示:
我把所有对数据库的操作都封装到了一个类中,写程序时就直接调用这个类的某个函数来返回结果!(我们学习网-weareleran.net)
在程序在需要的时候我就直接构造好SQL语句,调用这个函数即可,如下:
我按照这样的写基本已经没问题了,可以正常读取出数据,但是我现在担心的一个问题是Connection对象的关闭问题,因为是在函数中建立的 Connection对象,没办法在外部来关闭它,又不能在函数中关闭,如果在函数中就关闭了会提示‘阅读器关闭时Read的尝试无效’
但我在函数中就用了这一行:dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中对 CommandBehavior.CloseConnection的解释是‘在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。’
也就是说我在关闭了DataReader之后,关联的Connection会自动关闭,我也测试过,测试代码如下:
结果运行这一段,输出:Closed ,可见Connetion确实自动关闭了!但是如我在上面所说,我的Coonection是在函数在建立的,在函数中执行操作然后返回 DataReader,然后在外面读出数据,读取完毕后在外部关闭DataReader,这样函数中的Connetion会自动关闭吗
我把所有对数据库的操作都封装到了一个类中,写程序时就直接调用这个类的某个函数来返回结果!
下面是一个用来返回DataReader对象的通用类,
在程序在需要的时候我就直接构造好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会自动关闭,我也测试过,测试代码如下:
结果运行这一段,输出:Closed ,可见Connetion确实自动关闭了!但是如我在上面所说,我的Coonection是在函数在建立的,在函数中执行操作然后返回 DataReader,然后在外面读出数据,读取完毕后在外部关闭DataReader,这样函数中的Connetion会自动关闭吗?
自己做了个测试:(我们学习网-www.wearelearn.net)
结果输出 OpenClosed,呵呵,结果能关闭。
来自:http://hi.baidu.com/westfruit/blog/item/6ed56f1911927b4f43a9ad87.html
例如把数据库的操作都封装到了一个类中,但SqlDataReader只有在读取完毕时才能关闭数据库,这样类中就不能关闭书库库连接。在函数中关闭,如果在函数中就关闭了会提示‘阅读器关闭时Read的尝试无效’ .
这点微软当然想到了。用着个方法dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);,MSDN中对 CommandBehavior.CloseConnection的解释是‘在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。’
但。。。。。,请看下面的问题:
在函数中执行操作然后返回DataReader,然后在外面读出数据,读取完毕后在外部关闭DataReader,这样函数中的Connetion会自动关闭吗?
实例展示:
我把所有对数据库的操作都封装到了一个类中,写程序时就直接调用这个类的某个函数来返回结果!(我们学习网-weareleran.net)
下面是一个用来返回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会自动关闭吗
我把所有对数据库的操作都封装到了一个类中,写程序时就直接调用这个类的某个函数来返回结果!
下面是一个用来返回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会自动关闭吗?
自己做了个测试:(我们学习网-www.wearelearn.net)
public SqlConnection conn; protected void Page_Load(object sender, EventArgs e) { conn = new SqlConnection(DAL.SQLHelper.conn_String); show(); } //简单的封装方法 protected static SqlDataReader reDatareader(SqlConnection conn) { SqlCommand cmd = new SqlCommand("select top 10 * from article ", conn ); conn.Open(); SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); return dr; } //应用封装方法 protected SqlDataReader redr() { SqlDataReader dr = reDatareader(conn); return dr; } //调用类,模拟3层构架。 protected void show() { SqlDataReader dr = redr(); if (dr.HasRows) { while (dr.Read()) { } Response.Write(conn.State.ToString()); dr.Dispose(); Response.Write(conn.State.ToString()); } }
结果输出 OpenClosed,呵呵,结果能关闭。
来自:http://hi.baidu.com/westfruit/blog/item/6ed56f1911927b4f43a9ad87.html
相关文章推荐
- asp.net中连接access数据库时,不能使用ISNull()T-SQL的问题解决
- asp.net使用LINQ to SQL连接数据库及SQL操作语句用法分析
- asp.net使用LINQ to SQL连接数据库及SQL操作语句用法分析
- ASP.NET优化连载(三)只读数据访问用SqlDataReader,不要使用DataSet
- c#学习笔记(数据库连接以及SqlDataReader、SqlCommand的使用)
- ADO.NET访问数据库-SqlCommand的ExecuteReader方法一般配合sqldatareader使用
- WebPart-----asp.net ajax CTP 拖拽控件使用时的数据库连接问题
- c#数据库访问返回值类型为SqlDataReader时使用using时注意的问题
- 使用SqlDataReader应该注意的问题,使用datareader没有获取到分页的output值【来自Mist .NET blog】
- asp.net中SqlDataReader获取数据存在的问题解决方法
- 关于数据库查询语句SqlDataReader的连接释放问题的解决办法
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- 黑马程序员_学习日记47_615数据库开发及ADO.Net(连接字符串、SqlDataReader对象、连接池)
- C#连接数据库sqlserver2005,执行sql,得到SqlDataReader结果的实例
- (WebSite----Asp.Net Configuration----->无法连接到SQL Server数据库------>选择数据存储区---->应用程序当前被配置为使用提供程序:AspNetSqlProvider)解决方案
- ASP.NET连接Oracle问题1:System.Exception: System.Data.OracleClient requires Oracle client software version 8.1.7 or greater
- asp.net 网站发布到服务器上 数据库连接问题
- 谈谈Asp.net网站优化一:SqlDataReader和DataSet的选择
- ASP.NET中数据库连接字符串的若干问题
- asp.net SqlDataAdapter对象使用札记