あなたはそれをすべきではありません!リーダーはできるだけ早く閉じる必要があります。列挙中は開いたままにしないでください。明示的なリストを作成し、それを返す方がよいでしょう。
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 が実際に何をするかについてのコメントには、混乱があるようです。MSDN から:
SqlDataReader が使用されている間、関連付けられた SqlConnection は SqlDataReader を提供するためにビジーであり、SqlConnection を閉じる以外の操作は実行できません。これは、SqlDataReader の Close メソッドが呼び出されるまでのケースです。たとえば、Close を呼び出すまで、出力パラメーターを取得することはできません。
したがって、できるだけ早く閉じて接続を解放する必要があります。