关于SqlDataReader 的关闭问题

celeries 2004-09-01 10:54:29
我在过程中是用了CommandBehavior.CloseConnection,具体代码如下
public SqlDataReader GetUserplace(string Value)
{
string conn, sql;
conn = "server=MSSQL;uid=caexpo;pwd=caexpo;database=Question";
sql = Value;
SqlConnection connection = new SqlConnection(conn);
connection.Open();
SqlCommand objCommand = new SqlCommand(sql,connection);

SqlDataReader objReader ;
objReader = objCommand.ExecuteReader(CommandBehavior.CloseConnection);
return objReader;
}

在页面上,我用SqlDataReader objReader = GetUserplace("xxx")进行调用,在调用完成后,我及时的关闭了在页面上创建的objReader ,关闭方法如下:objReader.close();

但是我发现在访问量大的时候,我的数据库连接还是满了,请问应该怎么做?
...全文
212 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ai0ai 2004-10-13
  • 打赏
  • 举报
回复
应当在页面上实现数据库的开关,不要放到后台函数里
UP2Y 2004-10-13
  • 打赏
  • 举报
回复
http://blog.joycode.com/saucer/archive/2004/07/24/28365.aspx
cancersyf 2004-10-09
  • 打赏
  • 举报
回复
关键是数据库连接需要关闭,尽量不要频繁的进行数据库连接,数据库连接属于非托管资源,对性能的影响很大。
bineon 2004-10-09
  • 打赏
  • 举报
回复
你的代码本身没有任何问题。一旦你关闭了reader以后conn也会被关闭。至于连接问题,呵呵它的销毁有.net本身负责完成,可能是它没有及时处理吧
jamesfay 2004-09-02
  • 打赏
  • 举报
回复
没关系的,这都是一些缓冲的connection,长期不用后数据库会自己释放的。
微启子 2004-09-02
  • 打赏
  • 举报
回复
同意楼上的!我一般用datatable  dataset
这样用完就关闭!
jimh 2004-09-02
  • 打赏
  • 举报
回复
楼上几位说的好,如果不在同一个类里,就不要用DataReader了,使用datatable或dataset吧。
cuiwb770111 2004-09-02
  • 打赏
  • 举报
回复
建议还是使用DataSet和DataTable,每当读取一批数据后就关闭可能解决你上述问题。
mywebcom 2004-09-02
  • 打赏
  • 举报
回复
你反正是要读取一批数据,就是读取数据的时候,你的数据库是连接的,一旦读完了,马上关闭,问题是你现在返回DataReader,这肯定不可行,因为它是需要数据库一直是连接的。

所以你可以返回DataSet,.net 得 ado.net 的核心东西,你不要忘记用啊!!!
bitsbird 2004-09-02
  • 打赏
  • 举报
回复
要用到数据访问层来访问数据,由于获取数据和使用数据是在不同的类中,而且大多数情况还不在同一个assembly中,所以数据层返回的结果不可能是DataReader,因为DataReader是同一个打开的连接关联的,在使用找个DataReader时相应的连接必须是打开的,所以在分层结构中用DataReader返回数据是不合理的.做数据层时可以统一结果用datatable或dataset返回
dxphero 2004-09-02
  • 打赏
  • 举报
回复
用datareader有个缺点就是它的connection.open()跟.close()不好控制
那你在每次执行前先要判断它是否打开如果打开就继续执行否则就要打开
没执行完reader都要把connection关闭
zhpsam109 2004-09-01
  • 打赏
  • 举报
回复
慢有很多种原因的!
celeries 2004-09-01
  • 打赏
  • 举报
回复
如果没有用的话,那怎么返回sqldatareader
celeries 2004-09-01
  • 打赏
  • 举报
回复
过程外怎么关闭connection?
如果在过程内关闭了,return objReader;
就不能返回值了
我在程序中用了CommandBehavior.CloseConnection,大家不是都就这个是在datareader关闭的时候Connection会自动关闭吗?但是在过程外有没有什么用呢?
wangdr 2004-09-01
  • 打赏
  • 举报
回复
connection.Close();
Firestone2003 2004-09-01
  • 打赏
  • 举报
回复
你的connection没有关闭啊
connection.Close();
celeries 2004-09-01
  • 打赏
  • 举报
回复
可是我在SQLSERVER的管理工具中看到的连接好像并没有被释放呀,是怎么回事
qqqdong 2004-09-01
  • 打赏
  • 举报
回复
加大数据库的连接许可
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace BS { public partial class frmLogin : Form { public static string str_name;//记录登录用户名字 public static string str_pwd;//记录登录用户密码 public static string str_right;//记录登录用户权限 BS.BaseOperate boperate = new BS.BaseOperate(); BS.OperateAndValidate opAndvalidate = new BS.OperateAndValidate(); public frmLogin() { InitializeComponent(); } private void timer1_Tick(object sender, EventArgs e) { DateTime dt = DateTime.Now; //在登录页面显示获取的系统当前时间 label5.Text = "当前时间:"+dt.Year + "年" + dt.Month + "月" + dt.Day + "日" + dt.Hour + "时" + dt.Minute + "分" + dt.Second + "秒"; } private void button2_Click(object sender, EventArgs e) { Application.Exit(); } private void button1_Click(object sender, EventArgs e) { SqlDataReader sqlread = boperate.getread("select UserName,UserPwd from tb_User where UserName='" + cbox.Text.Trim() + "' and UserPwd='" + txtPwd.Text.Trim() + "'"); sqlread.Read();//HasRows属性用来获取一个值,指示SqlDataReader是否包含一行或多行 if (sqlread.HasRows) { str_name = cbox.Text; str_pwd = txtPwd.Text.Trim(); frmMain fmain = new frmMain(); this.Hide();//Hide()方法用来隐藏窗体 fmain.Show();//Show()方法用来显示执行窗体 } else { MessageBox.Show("用户名或密码错误!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); txtPwd.Text = ""; cbox.Focus();//Focus()方法用来为控件获取焦点 } sqlread.Close(); } private void frmLogin_Load(object sender, EventArgs e) { //通过调用公共类OpenAndValidate中的cboxBind方法对显示用户登录名的ComboBox控件进行数据绑定 opAndvalidate.cboxBind("select UserName from tb_User","tb_User","UserName",cbox); } private void cbox_SelectedIndexChanged(object sender, EventArgs e) { //通过调用公共类BaseOperate类中的getread方法成一个SqlDataReader对象 SqlDataReader sqlread=boperate.getread("select UserName,UserRight from tb_User where UserName='"+cbox.Text+"'"); //Read()方法用来使 SqlDataReader对象前进到下一条记录 if(sqlread.Read()) { label4.Text=sqlread["UserRight"].ToString(); str_right=label4.Text; } sqlread.Close();//Close方法用来关闭SqlDataReader对象} }

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧