2009-09-02 6 views
20

Gibt es eine Möglichkeit, ein Array über ein SqlDataReader (oder ein anderes C# ADO.NET-Objekt) zu füllen, ohne alle Elemente durchlaufen zu müssen? Ich habe eine Abfrage, die eine einzelne Spalte zurückgibt, und ich möchte das in ein Zeichenfolgenarray (oder ArrayList oder Liste usw.) einfügen.Füllen Sie ein Array (oder Arraylist) von SqlDataReader

Antwort

47

Es ist möglich. In .NET 2.0+ erbt SqlDataReader von DbDataReader, die IEnumerable (nicht-generische) implementiert. Dies bedeutet, dass Sie LINQ verwenden können:

List<string> list = (from IDataRecord r in dataReader 
        select (string)r["FieldName"] 
        ).ToList(); 

Das heißt, die Schleife ist immer noch da, es ist nur in Enumerable.Select versteckt, anstatt in Ihrem Code explizit zu sein.

+2

+1. Entfernt meine Antworten zugunsten Ihrer. –

+0

Hier sind Meister. Gute Antwort. – Tarik

+0

Funktioniert wie ein Champion, danke! – ristonj

4

Da alle IDataReader Implementierung (SqlDataReader enthalten) per Definition ein forward-only Leser sein wird, gibt es keine Möglichkeit, dies ohne Schleifen zu tun. Selbst wenn es eine Framework-Bibliotheksmethode gäbe, müsste dies den Reader durchlaufen, genau wie Sie es tun würden.

8

Nein, da SqlDataReader ist ein Vorwärts-Nur-Lese-Strom von Zeilen aus einer SQL Server-Datenbank, wird die Liste der Zeilen durch, ob explizit in Ihrem Code oder versteckt in einer Framework-Implementierung (wie Datatable des Load Verfahren durchgeschleift werden).

Es klingt wie die Verwendung einer generischen Liste und die Rückgabe der Liste als Array wäre eine gute Option. Beispiel:

List<int> list = new List<int>(); 

using (SqlDataReader reader = cmd.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     list.Add(reader.GetInt32(0)); 
    }  
} 
return list.ToArray(); 

Als Reaktion auf Ihren Kommentar kann der Aufruf von ToArray() möglicherweise Overhead sein, es hängt davon ab. Benötigen Sie ein Array von Objekten, mit denen Sie arbeiten können, oder wäre eine generische Sammlung (wie List<T> oder ReadOnlyCollection<T>) nützlicher?

+0

Denken Sie, dass TaArray() -Methode nur mehr Aufwand ist? – user161433

0

Sie müssen Schleife, aber es gibt Projekte, die es einfacher machen können. Versuchen Sie auch, ArrayList nicht zu verwenden, sondern stattdessen List.

Sie können FluentAdo Kasse für einen: http://fluentado.codeplex.com

public IList<UserAccount> List() 
    { 
     var list = new FluentCommand<UserAccount>("SELECT ID, UserName, Password FROM UserAccount") 
      .SetMap(reader => new UserAccount 
      { 
       ID = reader.GetInt("ID"), 
       Password = reader.GetString("Password"), 
       UserName = reader.GetString("UserName"), 
      }) 
      .AsList(); 

     return list; 
    } 
1

Wenn Sie lesen Ihre SqlDataAdapter in eine Datatable:

DataTable dt as DataTable; 
dt.fill(data); 

Dann einige der Spielzeug in System.Data.DataSetExtensions in Joel Muller Antwort als verwiesen auf diese question.

In verwendet ein bisschen Linq verwenden können, so werden Sie Net 3.5 oder höher net.

3

Offenbar seit .NET 1.1 SqlDataReaderthe following method hatte:

int size; 
object[] data = new object[]{}; 
size = reader.GetValues(data); 

Diese data mit den Werten der aktuellen Leser Reihe auffüllt, die Anzahl der Objekte zuweisen in Größe, die in das Array gesetzt wurden.

1

Das OR-OP hat nach Array, ArrayList oder List gefragt. Sie können auch Array zurückgeben. Rufen Sie einfach die .ToArray() -Methode auf und weisen Sie sie einem zuvor deklarierten Array zu. Arrays sind sehr schnell, wenn es darum geht, jedes Element aufzuzählen. Viel schneller als eine Liste, wenn die Liste mehr als 1000 Elemente enthält. Sie können zu Array, Liste oder Wörterbuch zurückkehren.

ids_array = (from IDataRecord r in idReader 
select (string)r["ID"]).ToArray<string>(); 

Außerdem, wenn Sie eine Suche nach Schlüsseln zum Beispiel verwenden, können Sie ein HashSet Objekt erstellen betrachten mit ausgezeichneter Suchleistung hat, wenn man einfach gegen eine andere Liste werden überprüft, um zu bestimmen, ob ein Element Schlüssel in der existiert HashSet-Objekt. Beispiel:

Verwandte Themen