# elegante Lösung bei first gesucht



## M!cha (23. Aug 2006)

Ich such gerade für den folgenden Code eine elegante Lösung!


```
Statement stmt = conn.createStatement();
			query = "SHOW COLUMNS FROM ab_namen";
			rs = stmt.executeQuery( query );

			System.out.println("Bitte ergänzen Sie folgene Daten!\n");
			
			while(rs.next()){
				i++;
			}
			data = new String[i];
			i = 0;
			
			rs.first();
			while(rs.next()){
					try {
						if(i == 0){rs.first();}
						System.out.print(rs.getString(1) + ":");
						data[i] = reader.readLine();
						i++; 
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}	
			}
```

Zum einen brauch ich i um die Größe des Arrays festlegen zu können.

Des weiteren verstehe ich nicht warum bei ersten while(rs.first) er wirklich vorne anfängt und wenn ich danach rs.first setzte er bei mir erst bei 2. element anfängt (deswegen das if(i==0))

Daten sind wieder die Feldnamen: Vorname, NAchname usw. Diese sollen nach eingabe des Useres in das Array geschreiben werden. (Vielllll Später dann in die Tabelle natürlich)

Danke für jegliche Hilfe,

M!icha


----------



## SlaterB (23. Aug 2006)

Was ist denn dein Ziel bei dem first()?
Ist das ResultSet nicht autmatisch am Anfang auf first()? 
Wozu bei i==0 das aufrufen?
Zumal du bei i==0 diesen Befehl dann genausogut vor der Schleife ausführen könntest, da ist ja i==0.
Anderseits tuts du das bereits jetzt schon, also noch mal die Frage: welcher Sinn?

--------

Ansonsten: viel einfacher wird ein Durchlauf durch ein Result-Set nicht.
Da gibts nunmal immer eine while-Schleife und IOException abzufangen.

In deinem Fall ist das in zweierlei Hinsicht etwas unglücklich aufgebaut, so dass ich mal zwei allgemeine Tipps noch dazu abgebe:
Erstens kombinierst du den Datenbank-Zugriff mit etwas anderem, irgendwelche Programmlogik.
So eine Durchmischung ist selten günstig.
Pack die Datenlogik lieber in eine einzelne Operation und liefere ein String-Array oder so zurück, mit dem dann EINFACHER weitergearbeitet werden kann.

Insgesamt wirst du mehr Code haben und auch mehr Laufzeit-Arbeit da die Felder zweimal durchlaufen werden
(1. Durchlauf Resultset -> Array, 2. Durchlauf Array -> Anzeige)

Sowas ist aber zu vernachlässigen gegeüber den Vorteil, dass die einzelnen Code-Teile einfacher und modularer, leichter zu ändern, sind.

Zweitens solltest du es wahrscheinlich insbesondere vermeiden, ein Resultset über mehrere Sekunden/ Minuten zu durchlaufen und nebenbei auf Benutzereingaben zu warten!

Ich weiß nicht 100%ig, ob da nebenbei die Datenbank warten muss, aber wenn, dann wäre das ziemlich übel.
(Allgemein gesehen, in einfachen kleinen Programmen natürlich problemlos machbar)


----------



## M!cha (24. Aug 2006)

Also warum das if(i == 0){rs.first();} hab ich doch erklärt: wenn ich

```
while(rs.next()){ 
               try { 
                  if(i == 0){rs.first();} 
                  System.out.print(rs.getString(1) + ":"); 
                  data[i] = reader.readLine(); 
                  i++; 
               } catch (IOException e) { 
                  // TODO Auto-generated catch block 
                  e.printStackTrace(); 
               }    
         }
```
mache dann ist nach dem while(rs.netx()) der zeiger auf der 2. position. und das wollte ich wissen. Obwohl ich vor dem while rs.first() mache gibt mit ein test print "nachname" = 2. Wert aus. Eigentlich müsste doch "vorname" kommen.Deswegen das i==0. Dann kommt auch vorname..weil der zeiger richtig ist. Das is erstmal ein Problem.


----------



## KSG9|sebastian (24. Aug 2006)

Du brauchst das ResultSet nicht zweimal durchlaufen. Speicher in der zweiten Schleife sämtliche Ergebnisse in ner List (ArrayList oder so) und caste dann


```
List l = new ArrayList();
while(rs.next()){
   l.add(reader.readLine());
}
data = (String[])l.toArray(new String[l.size()]);
```

Wozu ne Benutzereingabe beim Durchlaufen des ResultSets?
Würd das ganze so lösen:

1. Sämtliche Daten aus der DB in ein eigenes Objekt oder ne Collection/List überführen
2. ResultSet schließen
3. Benutzerabfragen durchführen

Edit:

Ach ja, das ResultSet steht fur -1, wenn du in der Schleife dann while(rs.next()) machst dann passt das, die Abfrage ob i==0 ist unnötig.

gruß


----------

