1

SQLデータベースからリストにデータ(1つのテーブルから4つの列)をロードしようとしていますが、これまでのところこれがあります

List<string> FNameList = (from IDataRecord r in myReader
                          select (string)r["FirstName"]).ToList();

List<string> LNameList = (from IDataRecord r in myReader
                          select (string)r["LastName"]).ToList();

List<string> EmailList = (from IDataRecord r in myReader
                          select (string)r["Email"]).ToList();

List<string> PhoneList = (from IDataRecord r in myReader
                          select (string)r["PhoneNumber"]).ToList();

現在、使用しているデータベースには3行のデータがあるため、それぞれの長さは3になります。ただし、最初の1つだけが3行の長さを返します。他のものの長さは0です。さらに奇妙なことに、最初のものをコメントアウトすると、2番目のものは機能しますが、他のものは機能しません。同様に3番目と4番目。

テスト用のデータベースを提供できないため、説明するのが難しいので、上記で明らかなことがあるのか​​、それともこれが列データを配列/リスト形式にロードするための間違ったアプローチであるのか疑問に思います。

4

4 に答える 4

3

Select私はあなたがこれに似た拡張方法を持っていると仮定します:

public static IEnumerable<T> Select<T>(this IDataReader reader, Func<IDataRecord, T> selector)
{
    while(reader.Read())
        yield return selector(reader);
}

したがって、リーダーが列挙されると、それは使用可能なデータの最後にあり、データを再度読み取る唯一の方法は、クエリを再発行することです。したがって、すべてのフィールドを一度にフェッチする必要があります。

var records = (from IDataRecord r in myReader
               select new
               {
                   FirstName = (string)r["FirstName"],
                   LastName = (string)r["LastName"],
                   Email = (string)r["Email"],
                   PhoneNumber = (string)r["PhoneNumber"]
               }).ToList();
于 2012-08-07T09:21:55.193 に答える
2

読者は、最初のクエリの後、最後のレコードに進んでいます。すべての行を抽出してから、リストを作成する必要があります。

var records = (from IDataRecord r in myReader select r).ToArray();

List<string> LNameList = (from IDataRecord r in records
                       select (string)r["LastName"]).ToList();
// Keep the last row for all fields
于 2012-08-07T09:15:02.120 に答える
2

myReaderはSqlDataReaderです。SqlDataReader provides a way of reading a forward-only stream of rows from a SQL Server database。最初の使用後、再開することはできません。

すべてのデータを1つのループで読み取り、必要に応じてリストを作成する必要があります。
ただし、なぜこのように情報を分割するのか理解できません。

于 2012-08-07T09:16:17.517 に答える
1

まず、プロパティを保持するpocoを宣言します。

class Person
{
    ...
}

次に、ヘルパーメソッド:

private static IEnumerable<Person> ReadReader(IDataReader reader)
{
    using (reader)
    {
        while (reader.Read())
        {
            yield return new Person
            {
                FirstName = (string)reader["FirstName"],
                LastName = (string)reader["LastName"],
                Email = (string)reader["Email"],
                PhoneNumber = (string)reader["PhoneNumber"]
            }
        }
    }
}

使用法:

List<Person> list = RaderReader(command.ExecuteReader()).ToList();
于 2012-08-07T09:16:41.920 に答える