3

私はこのコードが機能しています:

public IEnumerable<string> GetEmpNames()
{
    var cmd = SqlCommand("select [EmpName] from [dbo].[Emp]");
    using (var rdr = cmd.ExecuteReader())
        while (rdr.Read())
            yield return (string) rdr["EmpName"];
}

ただし、利回り returnに頼る必要のない、より良い (LINQish) 方法があるかどうか疑問に思っています。(そして、LINQ to SQLはオプションではありません:))

4

2 に答える 2

5
IEnumerable<string> result = DataContext.ExecuteQuery<string>(sqlstring)

http://msdn.microsoft.com/en-us/library/bb361109.aspx

于 2009-10-15T14:52:08.507 に答える
3

あなたはそれをすべきではありません!リーダーはできるだけ早く閉じる必要があります。列挙中は開いたままにしないでください。明示的なリストを作成し、それを返す方がよいでしょう。

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 を呼び出すまで、出力パラメーターを取得することはできません。

したがって、できるだけ早く閉じて接続を解放する必要があります。

于 2009-10-15T14:52:24.420 に答える