关于SQLDataReader的释放的问题 我在一个类SQLconn里面申明了一个SqlDataReader,即SQLconn.SqlDr,SQLconn有一个方法返回一个SqlDataReader给SQLconn.SqlDr。现在有这样一个问题想问一下,就是我在一次read()用完这个SQLconn.SqlDr以后是不是要Dispose()掉,Dispose()掉以后下次还要将返回值给SQLconn.SqlDr时候可以,还是要重新申明?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用完就关、下次用就再开。你这个逻辑有问题吧?我都看不明白。如果你是写了一个方法返回一个SqlDataReader,那么每次用的时候都先定义一个SqlDataReader来接收他的返回值。 你在重新说一边,到底和DataReader有什么关系 不需要dispose先定义一个sqlreader然后你的方法执行了返回值付给它然后close下次再返回直接赋值给它不需要再用它了,dispose 是这样的我需要在其他的地方引用SQLconn这个类,SQLconn里有一个查询的方法,SQLconn.sqlselect,这个类返回一个SqlDataReaderpublic class SQLconn { private SqlDataReader _sqldatareader; public Sqlselect() { _conn.ConnectionString = "server=" + _servername + ";database=" + _dbname + ";uid=" + _uid + ";pwd=" + _password; _sqlcmd.CommandText=_cmdstr; _conn.Open(); _sqlcmd.Connection=_conn; _sqldatareader=_sqlcmd.ExecuteReader(); _sqlcmd.Dispose(); _conn.Close(); return _sqldatareader; }}这个类跟这个帖子的主题有关的部分是这样的,SQLconn.sqlselect这个方法不是直接返回一个SQLDataReader,因为这个SQLDataReader是需要使用完以后在Sqlselect方法里dispose掉的,所以我另外申明了一个_sqldatareader用来获得返回值现在的问题是,main里面需要调用SQLconn.sqlselect(),SQLDataReader dr=new SQLDataReader();SQLconn.sqlselect();dr=SQLconn._sqldatareader;这样以后我是不是需要把这个SQLconn._sqldatare dispose掉,这个_sqldatareader以后是还要用的 我理解dispose和close不一样的,dispose是完全释放了资源close是将释放连接,而且把资源返回连接池我理解上面我看的不是很懂,我觉得是否可以用using语句呢也可以释放资源啊 public class SQLconn { //去掉private SqlDataReader _sqldatareader; public static IDataReader Sqlselect() { _conn.ConnectionString = "server=" + _servername + ";database=" + _dbname + ";uid=" + _uid + ";pwd=" + _password; _sqlcmd.CommandText=_cmdstr; _conn.Open(); _sqlcmd.Connection=_conn; SqlDataReader reader= cmd.ExecuteReader(CommandBehavior.CloseConnection);//替换掉这句_sqlcmd.ExecuteReader(); //去掉_sqlcmd.Dispose(); //去掉_conn.Close(); return reader; }} 使用的时候using(IDataReader dr = SQLconn.Sqlselect()){ //操作} 按你的理解用完DataReader以后是不能使用Dispose的,因为连接没有返回连接池,下载链接还要重连 你这里的reader不需要释放吗? using(IDataReader dr = SQLconn.Sqlselect()){ //操作} 释放了注意下这句 SqlDataReader reader= cmd.ExecuteReader(CommandBehavior.CloseConnection);//替换掉这句_sqlcmd.ExecuteReader(); CommandBehavior.CloseConnection 会随着DataReader的关闭而关闭它所关联的Conn对象的。你如果看过微软出的Data Access Building Block 里面就是这样用的 这样啊那就是说这个reader是会自动释放的?还有问题,就是_sqlcmd和_conn是不是不需要关闭关闭的话是不是以后就不能再用了 CommandBehavior.CloseConnection 会随着DataReader的关闭而关闭它所关联的Conn对象的。=======================================================所以 _conn不需要关,会自动关sqlcmd 我从来就没管过,它不涉及数据库连接不用管它 CommandBehavior是不是需要申明的?是什么东东没用过呢 DataGrid中<ItemTemplate>中的控件如何条件隐藏 关于Devpress 皮肤修改器的问题 关于一个购物车的问题 DataGrid中使用DropDownList的问题(急) 问一个在线程中打开对话框的问题,顶者有分咯,不够再加!!! 求一个C#事件的写法? HttpRequest请求网址如何不转义 请教开发的思路:学校的排课模块思路如何?高分求! 报表怪问题,急救 急求:MSDN打不开,重装也不行,错误如下 class clasname <Type>...这个<Type>是啥意思...我在别人的问题看到的不解之外...进来看看代码 存储过程中如何使用变量?
下次用就再开。你这个逻辑有问题吧?
我都看不明白。如果你是写了一个方法返回一个SqlDataReader,那么每次用的时候都先定义一个SqlDataReader来接收他的返回值。
先定义一个sqlreader
然后你的方法执行了返回值付给它
然后close
下次再返回直接赋值给它不需要再用它了,dispose
我需要在其他的地方引用SQLconn这个类,SQLconn里有一个查询的方法,SQLconn.sqlselect,这个类返回一个SqlDataReader
public class SQLconn
{
private SqlDataReader _sqldatareader;
public Sqlselect()
{
_conn.ConnectionString = "server=" + _servername + ";database=" + _dbname + ";uid=" + _uid + ";pwd=" + _password;
_sqlcmd.CommandText=_cmdstr;
_conn.Open();
_sqlcmd.Connection=_conn;
_sqldatareader=_sqlcmd.ExecuteReader();
_sqlcmd.Dispose();
_conn.Close();
return _sqldatareader;
}
}
这个类跟这个帖子的主题有关的部分是这样的,SQLconn.sqlselect这个方法不是直接返回一个SQLDataReader,因为这个SQLDataReader是需要使用完以后在Sqlselect方法里dispose掉的,所以我另外申明了一个_sqldatareader用来获得返回值
现在的问题是,main里面需要调用SQLconn.sqlselect(),SQLDataReader dr=new SQLDataReader();
SQLconn.sqlselect();
dr=SQLconn._sqldatareader;
这样以后我是不是需要把这个SQLconn._sqldatare dispose掉,这个_sqldatareader以后是还要用的
dispose是完全释放了资源
close是将释放连接,而且把资源返回连接池
我理解上面我看的不是很懂,我觉得是否可以用using语句呢
也可以释放资源啊
{
//去掉private SqlDataReader _sqldatareader;
public static IDataReader Sqlselect()
{
_conn.ConnectionString = "server=" + _servername + ";database=" + _dbname + ";uid=" + _uid + ";pwd=" + _password;
_sqlcmd.CommandText=_cmdstr;
_conn.Open();
_sqlcmd.Connection=_conn;
SqlDataReader reader= cmd.ExecuteReader(CommandBehavior.CloseConnection);//替换掉这句_sqlcmd.ExecuteReader();
//去掉_sqlcmd.Dispose();
//去掉_conn.Close();
return reader;
}
}
使用的时候
using(IDataReader dr = SQLconn.Sqlselect())
{
//操作
}
你这里的reader不需要释放吗?
{
//操作
} 释放了
注意下这句 SqlDataReader reader= cmd.ExecuteReader(CommandBehavior.CloseConnection);//替换掉这句_sqlcmd.ExecuteReader(); CommandBehavior.CloseConnection 会随着DataReader的关闭而关闭它所关联的Conn对象的。你如果看过微软出的Data Access Building Block 里面就是这样用的
那就是说这个reader是会自动释放的?
还有问题,就是_sqlcmd和_conn是不是不需要关闭
关闭的话是不是以后就不能再用了
=======================================================
所以 _conn不需要关,会自动关sqlcmd 我从来就没管过,它不涉及数据库连接不用管它
是什么东东
没用过呢