你不应该那样做!您的阅读器需要尽快关闭。您不想在枚举期间保持打开状态。最好只创建一个显式列表并将其返回。
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(),否则在尝试枚举的时候会报错,因为reader已经被关闭了。
编辑
关于 DataReader 打开时实际执行的操作的评论似乎有些混乱。来自 MSDN:
在使用 SqlDataReader 时,关联的 SqlConnection 正忙于为 SqlDataReader 提供服务,除了关闭 SqlConnection 之外,无法对 SqlConnection 执行其他操作。在调用 SqlDataReader 的 Close 方法之前就是这种情况。例如,在调用 Close 之前,您无法检索输出参数。
因此,您应该尽快关闭它以释放连接。