【发布时间】:2019-12-20 19:15:32
【问题描述】:
我想知道最佳做法是什么以及为什么。找不到任何可以清楚说明优点和缺点的内容。
仅供参考...我正在使用 .Net
哪个更好?
- 打开一个 SQLConnection
- 使用数据读取器执行我的 SQL
- 遍历结果
- 让我的 using 语句关闭阅读器
- 使用 using 语句关闭连接
或
- 打开一个 SQLConnection
- 使用数据读取器执行我的 SQL
- 使用 using 语句关闭连接
- 遍历结果
- 关闭阅读器
我对第二个的想法是,如果您的结果集很大,那么您保持连接打开的时间不会超过应有的时间。这是正确的,这就是我想要做的。
编辑
我有类似的东西。
using sq as new sqlconnection
>>connection and sproc stuff<<
using rd as new sqlreader
while rd.read
do some work
end while
end using
end using
这样做也很有效
dim rd as datareader
using sq as new sqlconnection
>>connection and sproc stuff<<
rd = sq.executereader
end using
while rd.read
do work
end while
【问题讨论】:
-
您是否尝试在阅读器打开的同时关闭连接?阅读器正在读取(流式传输)连接的结果。
-
这不是我的经验。我的测试显示关闭/处理连接会关闭活动阅读器。 “阅读器关闭时调用 Read 的尝试无效。”
-
我会说第一个选项。获取所有数据后让 Using 关闭阅读器,然后关闭与 using 块的连接。
-
您的代码中有些地方不匹配。我刚刚做了第二个块(查询只是
SELECT 1,不需要从服务器上的磁盘读取任何内容)并且连接上的end using仍然将rd.IsClosed更改为True,导致异常.我什至在 VB 而不是 C# 中做到这一点,以防 VB 在using块的范围内做一些奇怪的事情(官方技术术语)。无论如何,在使用阅读器之前关闭连接的共识结果是“不要”,即使它似乎工作(对你来说)。 -
为了彻底,我现在已经测试了关闭连接,然后在数据读取器上使用
System.Data.SqlClient、Microsoft.Data.SqlClient、Oracle.ManagedDataAccess、Npgsql、System.Data.SQLite调用Read、Microsoft.Data.Sqlite、MySql.Data和MySqlConnector。异常消息各不相同,Npgsql一直等到调用Get*方法之一才抛出它,但结果始终是异常。
标签: c# .net sql-server vb.net