这两种方法哪种好?哪种快?谢谢!

yanlan112 2009-01-22 09:32:32
SqlDataReader sdr = db.GetReader(sql, null);
DataList1.DataSource = sdr;
DataList1.DataBind();
sdr.Close();
sdr.Dispose();


DataList1.DataSource = db.GetReader(sql, null);
DataList1.DataBind();

其中db是我定义的一个数据库操作类;
.GetReader()返回一个SqlDataReader
...全文
210 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwmwss 2009-02-01
  • 打赏
  • 举报
回复
为什么返回datareader呢?返回个datatable,关闭连接。
调用datatable就行了
wangzhenyue 2009-01-31
  • 打赏
  • 举报
回复
可以在类里面写一个方法调用。。不是一样吗?
huxuanhui 2009-01-25
  • 打赏
  • 举报
回复
mark
学习
dangbuzhu 2009-01-25
  • 打赏
  • 举报
回复
我建议还是 及时的手动关闭,比较可靠。
chagel 2009-01-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yanlan112 的回复:]
我在GETREADER方法里写了sdr=cmd.ExecuteReader(CommandBehavior.CloseConnection);
有用吗?
[/Quote]
这句只是确保在关闭reader的时候及时关闭connection。

[Quote=引用 12 楼 yanlan112 的回复:]
objectdatesource是会自动关闭READER吗?
[/Quote]
不会。

[Quote=引用 16 楼 yanlan112 的回复:]
我在数据层里写的是:

return cmd.ExecuteReader(CommandBehavior.CloseConnection)

这样在应用的时候应该怎么写?

是在数据层里写
using(SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
{
  return sdr;
}
吗????

求教了!
[/Quote]
用你的第一种写法,用完reader及时关闭。
popeyepower 2009-01-24
  • 打赏
  • 举报
回复
在JS里是第一种写法快, 前段时间专门看到一篇这样的文章.
C#就不知道了.
yanlan112 2009-01-24
  • 打赏
  • 举报
回复
我在数据层里写的是:

return cmd.ExecuteReader(CommandBehavior.CloseConnection)

这样在应用的时候应该怎么写?

是在数据层里写
using(SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
{
  return sdr;
}
吗????

求教了!
lys1978900 2009-01-24
  • 打赏
  • 举报
回复
这两种写法没有区别,你也不可能在循环里调用上面的代码,因为有更好的处理方式。
第二种reader会被自动关闭,不需要考虑性能方面的问题,对于性能上的考虑,我觉得应该在DAL层里,或者存储过程里。
XCQ1228 2009-01-24
  • 打赏
  • 举报
回复
楼上的正解!

如果是选择第二种,在数据层一定要写:
using(SqlDataReader sdr = db.GetReader(sql, null))
{
}
hechenqingtian 2009-01-24
  • 打赏
  • 举报
回复
SqlDataReader sdr = db.GetReader(sql, null);
DataList1.DataSource = sdr;
DataList1.DataBind();
sdr.Close();
sdr.Dispose();


DataList1.DataSource = db.GetReader(sql, null);
DataList1.DataBind();
--------------------------------------------------
第一种关闭了数据库连接,当操作完数据库之后要关闭数据库连接,以免数据库连接池占满
第二种没有关闭连接,虽然代码量好像是减少了许多,但我推荐使用第一种,我们开发的过程中都要一定关闭数据库连接
如果不愿意手动管理数据库的连接关闭
可以使用using 关键字
using(SqlDataReader sdr = db.GetReader(sql, null))
{
}
yanlan112 2009-01-24
  • 打赏
  • 举报
回复
objectdatesource是会自动关闭READER吗?
yanlan112 2009-01-24
  • 打赏
  • 举报
回复
我在GETREADER方法里写了sdr=cmd.ExecuteReader(CommandBehavior.CloseConnection);
有用吗?
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yanlan112 的回复:]
我也是菜鸟,但第二种reader什么时候关闭?还是自动关!

我原来是用第二种
但不知道怎么关闭
[/Quote]

以你的写法,第一种在关闭SqlDataReader 的时候大概(你在GetReader方法内部设置好了)是立刻关闭SqlConnection。而第二种则需要等到物理内存不足GC开始回收资源时才关闭。

使用SqlConnection需要尽快关闭,否则就会造成连接池满的异常。所以按说你的第二种写法会在网站繁忙时经常造成这个异常。第一种写法虽然不会造成这个异常,但是你的GetReader方法的设计其实很容易造成编程时不小心忘记了及时关闭。

比较可靠的写法,是在GetReader方法返回一个DataTable或者强类型的对象集合,在GetReader方法内部就确保关闭了SqlConnection,而不是把这个责任抛给GetReader的调用者。
  • 打赏
  • 举报
回复
其实类似写法在不同的用法、环境,“快”是不确定的。你可以自己写程序模拟使用环境,然后循环运行1000次以上,计算平均时间。

关键是,知道哪一个快并不重要,要核算为价值才重要。如果差不了几毛钱价值,你的用户并不会在乎这种快慢区别,而反而对异步响应、功能扩展能力等等更愿意掏钱,你可以不拘于一种形式。
刷卡时为零 2009-01-22
  • 打赏
  • 举报
回复
SqlDataReader 可以自动绑定数据吗?我记得是不能绑定的啊!
phper2008 2009-01-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sunshine_anycall 的回复:]
就入lz说的第二种没关闭
第一种和第二种在使用上没有什么本质的区别
但是数据库资源是要释放的说
所以还是第一种好
[/Quote]
关键是看你取得dr时候怎么写了,用CommandBehavior.CloseConnection可以在使用完毕自动关闭!

不过显示关闭会更好!不会出现连接数目过多的情况!
flashlove2008 2009-01-22
  • 打赏
  • 举报
回复
sdr.Close();
sdr.Dispose();
这个去掉就没区别了
sunshine_anycall 2009-01-22
  • 打赏
  • 举报
回复
就入lz说的第二种没关闭
第一种和第二种在使用上没有什么本质的区别
但是数据库资源是要释放的说
所以还是第一种好
yanlan112 2009-01-22
  • 打赏
  • 举报
回复
我也是菜鸟,但第二种reader什么时候关闭?还是自动关!

我原来是用第二种
但不知道怎么关闭
田猿笔记 2009-01-22
  • 打赏
  • 举报
回复
两个没有什么区别,只是第一个添加多一个SqlDataReader sdr 这一个引用。
只是一个引用类型,多了小小的内存空间,效果差别不太。。
加载更多回复(2)

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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