"SqlDataReader.Read" die Spalten in eine Liste speichern.


BLR

Erfahrenes Mitglied
#1
Hallo,

ich möchte einen Datensatz (Typel) in eine Liste<String> aufspalten und das weiter verarbeiten.

Dafür gibts die bekannte Methode "Read"

Code:
 while (sqlReader.Read()
{
     lstdataRecord.Add(sqlReader["Vorname"].ToString());

}
aber ich möchte alle Spalten einfach in der Schleife auslesen und nicht jede einzelne mit "Vorname" usw...ansprechen...

Ich hab das noch mit Index probiert und zähle nach "add" eins hoch, aber dann geht er aus der Schleife heraus...
Wie macht man das. dass er alle Spalten aus dem Typel selbst durchgeht**** und das dann in eine List<string> übergibt.

Also als Code stelle ich mir das so vor:

Code:
 while (sqlReader.Read()
{
     for i =0; i<= sqlReader.lengh; i++
              lstdataRecord.Add(sqlReader[i].ToString());
    next
}
Wenn ich sage:

Code:
  for (int i = 1; i < sqlReader.FieldCount; i++)
  {
        dataRecord.Add(sqlReader.GetValue(i).ToString());
  }
Dann habe ich einen ungültigen Leseversuch.
Danke für jeden tipp.
 
Zuletzt bearbeitet:
#2
Erstmal vorweg,
am besten vielleicht nach 20min. nicht editieren sondern eher neuen Post anhängen.
Ich denke mal auch nicht das das als Push Versuch gewertet werden könnte, da du ja neue Infos gegeben hast.

Ansonsten der untere Bereich mit dem FieldCount schaut meines erachten erstmal richtig aus.
wenn dein Code ungefähr so ausschaut sollte es eigentlich gehen
Code:
 while (sqlReader.Read())
{
  for (int i = 1; i < sqlReader.FieldCount; i++)
  {
        dataRecord.Add(sqlReader.GetValue(i).ToString());
  }
}
Ansonsten mal original Code posten.
 

BLR

Erfahrenes Mitglied
#3
Hi, danke dir für die Antwort.
Sowas hab ich schon versucht, aber da kommt immer ne Exception "Unerlaubter Lesezugriff".
Nach dem man das "Read" einmal gelesen wurde, kann ich nicht noch mal in der Schleife von ihm lesen....

Deswegen frage ich mich, ob es andere "Lese_Objekte" gibts, ausser diesen unfrendlichen
"SqlDataReader".

Denn da kann ich nur bei einem Lese-Versuch sagen: read(spalte[0] + spalte[1] + spalte[3])
und da ich 10 Spalten auslese, finde ich das echt unschön....
 
#5
Ach
die berechtigungen auf der Datenbank passen auch alle oder?
Nicht das es am DB User liegt.
Und vielleicht nochmal exakte Fehlermeldung, vielleicht mit StackTrace, einfach damit man ev. mehr erkennt.
 

BLR

Erfahrenes Mitglied
#6
hi,
ja das hab ich auch bei microsoft gesehen:

Code:
  private static void ReadSingleRow(IDataRecord record)
    {
        Console.WriteLine(String.Format("{0}, {1}", record[0], record[1]));
    }
Das ist eben auch das Problem, man muss explizit angeben, welche Spalten man auslesen will:
record[0], record[1]
Also erste und zweite Spalte.
Das funktioniert auch, aber ich habe 10 Spalten und nun zu schreiben:

record[0]...............................................................................record[9]

ist doch echt unschön...
 

BLR

Erfahrenes Mitglied
#7
So, ich habs gelöst.
Anstatt mit diesem "SqlReader" zu arbeiten, braucht man erstmal "DataTable" von System.Data.
Und dann "Datarow" bzw. "DataColumn" je nach dem, was man braucht.

Dann kann man bequem durch alle alle Spalten durchlaufen und entsprechend handeln....

Danke
 

BLR

Erfahrenes Mitglied
#9
joooa aber dieses "sqlReader" Objekt lässt es nur einmal zu, was auszulesen.
Wenn ich nun in der Schleife den sqlReader verwende und Index hoch zähle, funktioniert das nur einmal und beim nächsten mal kommt ne Exception "Ungültiger Leseversuch"
 
#10
Also wenn ich das bisher richtig analysiert habe, funktioniert es, solange man nicht mit FieldCount arbeitet.
Du meintest ja direkte Indexangaben würden gehen.

Wenn ich dran denk schau ich morgen mal mit Reflector nach, denn irgendwie hatte ich so die probleme noch nicht.
Habe nie FieldCount verwendet, vielleicht passiert da ja irgendwas intern.
 

BLR

Erfahrenes Mitglied
#11
Ja funktionieren tut es :) aber auf welche Art und Weise?
Explizit die Indexe angeben, die man alle haben muss, denn man kann nur einmal aus der "Reader" was auslesen. Danach muss man das Ding wieder schließen, ne Abfrage starten und von vorne beginnen^^
Bei mehr als 5 Spalten in der Tabelle, wird es dann mühseelig explizit mit Indexen zu arbeiten