你不应该这样做!您的阅读器需要尽快关闭。您不希望在枚举期间保持打开状态。最好只创建一个明确的列表,然后返回。
var cmd = SqlCommand("select [EmpName] from [dbo].[Emp]");
List<string> results = new List<string>();
using (var rdr = cmd.ExecuteReader()) {
while (rdr.Read())
results.Add((string) rdr["EmpName"]);
}
return results;
您可以通过铸造它放在一个DataReader使用LINQ表达式:
using (var rdr = cmd.ExecuteReader()) {
results = (from row in rdr.Cast<DbDataRecord>()
select (string)row["EmpName"]).ToList();
}
但是请注意,你需要调用ToList(),或者当您尝试列举你会得到一个错误因为读者已经关闭了。
编辑
似乎是在什么时候它是开放的什么一个DataReader实际上做的评论有些混乱。 From MSDN:
当正在使用的SqlDataReader的, 的关联的SqlConnection忙 服务SqlDataReader中,并没有其他 操作可以上 比闭 它以外的的SqlConnection来执行。在调用SqlDataReader的Close 方法之前,情况就是如此。 例如,在调用 关闭之前,您无法检索 输出参数。
因此,您应该尽快关闭以释放连接。
它清晰简洁。完全切换到LINQ to SQL或保持原样。 “收益率回报”没有任何问题。 – 2009-10-15 14:51:20
@JoelFan,*收益率回报*有什么问题?这也是我如何做到的。 – 2009-10-15 14:52:01
@Stan,问题在于你将连接打开的时间超过了它应该是的 – 2009-10-15 15:00:35