C#查询完SQL SERVER结果之后,是不是要调用SqlDataReader.Dispose() 之后在调用close()关闭连接

谁学逆向工程 2017-07-22 02:39:01
C#查询完SQL SERVER结果之后,是不是要调用SqlDataReader.Dispose() 之后在调用close()关闭连接
using System;  
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

class Program
{
static void Main(string[] args)
{
string coonString = "server=192.168.30.10;database=ykhc;uid=sa;pwd=hc2008";
SqlConnection conn = new SqlConnection(coonString);
SqlCommand cmd = conn.CreateCommand();
//sql语句
cmd.CommandText = "SELECT goodsname, Basebarcode, saleprice, categorycode from \"000\".tbgoods";
//打开连接
conn.Open();
//执行sql
//cmd.ExecuteNonQuery();
//若要创建 SqlDataReader,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不要直接使用构造函数
SqlDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
Console.Write(dr[0] + "\t");
Console.Write(dr[1] + "\t");
Console.Write(dr[2] + "\t");
Console.Write(dr[3]);
Console.WriteLine();
}
dr.Dispose();
//关闭连接
conn.Close();

}
}
...全文
465 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2017-07-24
  • 打赏
  • 举报
回复
sqlconnection和dataread需要关闭, 可以通过using释放,也可以自己close。 至于.net的gc回收,不用关心他的机制。
wang_peng_yl 2017-07-24
  • 打赏
  • 举报
回复
还有关闭的事,也不用担心,一个Close足够了,
wang_peng_yl 2017-07-24
  • 打赏
  • 举报
回复
完全没有必要用 dr.Dispose(); 因为底层已经帮你做好了。 也没必要用using()方法,在c#里,就算这样用了,你观察吧,内存也不会减少的, 只会把这个变量放在回收站里,内存还占着, C#有自己的回收机制,得达一定内存量才释放,但可以确认的是肯定不是时时释放 如果你这个功能并发量非常大, 就是必需考虑时时释放内存, 那就不要用C#写了,用java写都比C #强
XBodhi. 2017-07-24
  • 打赏
  • 举报
回复
DataReader 必须手动关闭,否则很危险。不用 Dispose ,Close 会自动 Dispose的,Close 即可
  • 打赏
  • 举报
回复
楼主这标题误导啊 是DataReader进行Dispose,然后Connection进行Close,这两个不是同一个东西,当然要Close了
  • 打赏
  • 举报
回复
是的,在我们说 DbDataReader 和 DbConnection 的 Dispose 的时候,其实就是说 Close。这里假设你知道自己去研究 Dispose 到底是要干什么的,并没有那么多功夫再来细抠 Dispose 跟 Close 有什么区别。而是直接越过它,讨论更重要的设计逻辑。
snlixing 2017-07-23
  • 打赏
  • 举报
回复
如果一个类同时拥有Dispose和Close方法,一般来说,Dispose中都会调用Close方法
ilikeff8 2017-07-23
  • 打赏
  • 举报
回复
用using块,都不需要写
  • 打赏
  • 举报
回复
调用 Dispose、Close,应该是在你知道为什么要调用的时候才调用。通常它一定会严重影响异步能力、影响性能。所以当必须 Dispose 的时候才 Dispose,当必须 Close 的时候才 Close,不要盲目地调用 Dispose、Close。 当然对于初学者,往往是编程图省事儿、从众就好,而并不接触极限的东西。这个时候往往写出了冗余的代码,这就需要不断地在实际测试中,删除多余的代码。
  • 打赏
  • 举报
回复
对于你的代码来说,这两个都是不需要的。Close 会在 GC 回收对象是自动调用 Close,所以调用 Dispose 和 Close 是多此一举。 当你编写服务器端程序的时候,由于服务器程序通常是并发多线程地操作的,是迅速提供给大量并发请求的(也包括同一个请求线程,在一个连接未关闭之前,需要嵌套地打开其它数据库连接的情况),那么这个时候需要及时地对DbConnection执行 Close,以便保证用比较少量的连接池资源就能服务并发使用需求。比如说用10几个数据库连接就能服务于每秒上千个并发请求。此时写
using(var conn = createConnection())
{
     .....
}
这样的结构来保证及时关闭数据库连接。 进一步地,当你自己的过程打开了一个 DbConnection,你通过 command.ExecuteReader 查询数据之后,假设需要将这个数据库连接再用于第二个 dbCommand.ExecuteReader 查询,那么自然是必须先要将前一个 DbReader 执行 Close 操作,否则在第二个查询时就会因为“数据连接正在被其它 Reader 占用”而崩溃。此时写
List<...> result;
using(var reader = command.ExecuteReader())
{
    .......
    result = .......
}
.......
来及时关闭 DbReader。 对于你的程序来说,太简单了,它既没有演示出用同一个 DbConnection 反复给多个 DbDataReader 使用的情况,更没有较多并发访问 DbConnection 的情况。所以根本不需要及时调用 Close,就是让 GC 机制去自动地调用 Close 就足够了,你什么都不用写也不会出错。
雷诺兹 2017-07-22
  • 打赏
  • 举报
回复
using更方便

110,539

社区成员

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

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

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