# DB Felder in einem Array speichern und wieder auslesen



## Louis2 (10. Jun 2005)

Hallo,

ich habe eine DB Verbindung wie folgt aufgebaut:

```
try 
{ 
    String resultauftrag=new String();
    Class.forName("oracle.jdbc.driver.OracleDriver"); 
    //DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
    String url = "jdbc:oracle:thin:@"+DBServer+":1521:"+DBName; 
    Connection connection = DriverManager.getConnection(url, DBUser, DBPassword);
    connection.setAutoCommit(false);
                
    Statement auftrag = connection.createStatement(); 
    resultauftrag = "SELECT AUF001, AUF012, AUF004, AUF015, AUF016, AUF020 FROM Auftrag WHERE customerid='1619'"; 
    ResultSet rs = auftrag.executeQuery(resultauftrag); 
    connection.commit();
```

1. Ich möchte nun die Felder aus der Query in einem Array anzeigen lassen (fortlaufend, muss auch in Betracht ziehen, dass mehrere Sätze gefunden werden können)
2. Das Array soll dann wieder in einer JTextArea ausgelesen werden, bzw. die Daten dort erscheinen (Übersichtlich!).

So nun die Frage, wie geht das denn? ???:L


----------



## Bleiglanz (10. Jun 2005)

while(rs.next()){
// tuwas, z.B. System.out.println(rs.getString(1));

}


----------



## Louis2 (10. Jun 2005)

Da ich die Anzahl an Zeilen in der DB nicht kenne, sondern nur die Anzahl an Spalten habe ich mal das ganze mit einem ArrayList probiert.

```
try 
{ 
	//String resultauftrag=new String();
        String resultauftrag1=new String();
        String resultauftrag2=new String();
        String resultauftrag3=new String();
        String resultauftrag4=new String();
        String resultauftrag5=new String();
        String resultauftrag6=new String();
        Class.forName("oracle.jdbc.driver.OracleDriver"); 
        //DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
        String url = "jdbc:oracle:thin:@"+DBServer+":1521:"+DBName; 
        Connection connection = DriverManager.getConnection(url, DBUser, DBPassword);
        connection.setAutoCommit(false);
               
        Statement auftrag = connection.createStatement(); 
        //resultauftrag = "SELECT AUF001, AUF012, AUF004, AUF015, AUF016, AUF020 FROM Auftrag WHERE customerid='1619'"; 
        resultauftrag1 = "SELECT AUF001 FROM Auftrag WHERE customerid='1619'"; 
        resultauftrag2 = "SELECT AUF012 FROM Auftrag WHERE customerid='1619'"; 
        resultauftrag3 = "SELECT AUF004 FROM Auftrag WHERE customerid='1619'"; 
        resultauftrag4 = "SELECT AUF015 FROM Auftrag WHERE customerid='1619'"; 
        resultauftrag5 = "SELECT AUF016 FROM Auftrag WHERE customerid='1619'"; 
        resultauftrag6 = "SELECT AUF020 FROM Auftrag WHERE customerid='1619'"; 
        //auftrag.executeQuery(resultauftrag); 
        auftrag.executeQuery(resultauftrag1);
        auftrag.executeQuery(resultauftrag2);
        auftrag.executeQuery(resultauftrag3);
        auftrag.executeQuery(resultauftrag4);
        auftrag.executeQuery(resultauftrag5);
        auftrag.executeQuery(resultauftrag6);
	connection.commit();
        
	Map map = new HashMap(); 
        map.put("Auftragsnummer", new ArrayList()); 
        map.put("Kommunikationsnummer", new ArrayList()); 
        map.put("Gedruckt am", new ArrayList()); 
        map.put("Umsatzwert", new ArrayList()); 
        map.put("WE", new ArrayList()); 
        map.put("Zustand", new ArrayList()); 

        List list = (List) map.get("Aufstragsnummer"); 
        list.add(resultauftrag1); 
        List list = (List) map.get("Kommunikationsnummer"); 
        list.add(resultauftrag2); 
        List list = (List) map.get("Gedruckt am"); 
        list.add(resultauftrag3); 
        List list = (List) map.get("Umsatzwert"); 
        list.add(resultauftrag4); 
        List list = (List) map.get("WE"); 
        list.add(resultauftrag5); 
        List list = (List) map.get("Zustand"); 
        list.add(resultauftrag6);
```

Sieht aber etwas umständlich aus, mit den ganzen Spalten die angelegt werden müssen, die Werte herausgenommen werden müssen, 6mal executeQuery usw...

Frage 1: Kann man das kürzen?
Frage 2: Gibt es eine bessere Lösung, bzw. ist überhaupt mein Code korrekt?
Frage 3: Das beste wäre natürlich überhaupt nichts festlegen zu müssen, man führt die SQL Abfrage aus, und fügt sie in einem Array automatisch ein. Bei der Lösung oben ist ja das Problem, dass wenn es eine Spalte mehr geben sollte in der DB, der Code dann wieder geändert werden muss...

Anm: Ausserdem kommt beim compilieren die Meldung:

```
SammelMailGUI_Swing.java [109:1] reference to List is ambiguous, both class java.awt.List in java.awt and class java.util.List in java.util match
                List list = (List) map.get("<spaltenname>");
```

Ich brauche aber beide Klassen, wie kann ich für die Liste eine festlegen?


----------



## bambi (10. Jun 2005)

Louis2 hat gesagt.:
			
		

> Frage 1: Kann man das kürzen?


Sicher, war doch auch schon in Deinem Code drin. Warum so umstaendlich?

```
resultauftrag = "SELECT AUF001, AUF012, AUF004, AUF015, AUF016, AUF020 "
                             + "FROM Auftrag WHERE customerid='1619'";
        auftrag.executeQuery(resultauftrag);
```



			
				Louis2 hat gesagt.:
			
		

> Frage 2: Gibt es eine bessere Lösung, bzw. ist überhaupt mein Code korrekt?


Ich wuerde es nur mit dem einen Statement (oben) machen. Du kannst dann durchs ResultSet loopen und die 
einzelenen Werte auslesen und in vers. ArrayLists schreiben. Fuer jede Zeile musst Du dann eben die entsprechenden
Werte zur entspr. ArrayList adden.
(nur ein )Beispiel:

```
rs = statementmt.executeQuery(query);
List a = new ArrayList();
List b = new ArrayList();
while (rs.next()) {
   a.add(rs.getString(1));
   b.add(rs.getString(2));
}

hashMap.put("KeyA", a);
hashMap.put("KeyB", b);
```



			
				Louis2 hat gesagt.:
			
		

> Frage 3: Das beste wäre natürlich überhaupt nichts festlegen zu müssen, man führt die SQL Abfrage
> aus, und fügt sie in einem Array automatisch ein. Bei der Lösung oben ist ja das Problem, dass wenn es eine Spalte
> mehr geben sollte in der DB, der Code dann wieder geändert werden muss...


Versteh hier nicht so ganz, was Du machen willst. Also Du kannst auf jeden Fall immer mit while durchs ResultSet gehen
und alle Werte auslesen, ist also kein Problem die Werte zu bekommen, aber Du musst dann auf jeden Fall aendern
wie Du die Daten in die HashMap schreibst - auch mit while oder for oder sowas...



> Anm: Ausserdem kommt beim compilieren die Meldung:


Du importierst einfach nur eine Art von List und bei der anderen musst Du dann eben immer genau angeben welche
Klasse Du meinst:

```
java.util.List list = (java.util.List) map.get("<spaltenname>");
```


----------



## Gast (10. Jun 2005)

@bambi: 

```
resultauftrag = "SELECT AUF001, AUF012, AUF004, AUF015, AUF016, AUF020 FROM" + "Auftrag WHERE customerid='1619'"; 
ResultSet rs = auftrag.executeQuery(resultauftrag); 
Map map = new HashMap(); 
List a = new ArrayList(); 
List b = new ArrayList(); 
while (rs.next()) 
{ 
a.add(rs.getString(1)); 
b.add(rs.getString(2)); 
} 
hashMap.put("KeyA", a); 
hashMap.put("KeyB", b);
```

Ich verstehe nicht richtig, was der Code macht.
Also ich selektiere erst 6 Felder in einer Tabelle. Die können mehrere Sätze (Zeilen) haben.
1. Mit List a gründe ich eine ArrayList für das erste Feld, list b für zweite... d.h wenn ich 6 Felder selektiert habe, muss ich 6 ArrayList gründen, also bis List f??? 

2. ResultSet holt sich dann die Werte der ersten Zeile der 6 Felder und fügt en ersten Wert mit a.add in der ArrayList 1 (also in meinem Fall in AUF001), richtig?? D.h ich muss auch bis f.add gehen...?

3. Was macht aber das 
hashMap.put("KeyA", a); 
hashMap.put("KeyB", b);
wofür steht "KeyA" in meinem Programm?

4. Da ich die Werte noch ausgeben möchte danach in einer JTextArea wollte ich auch für meine ArrayListen Header einfügen. Wie geht das?

Danke!


----------



## bambi (10. Jun 2005)

Also das war wirklich nur als kleines Beispiel gemeint. Du musst das dann natuerlich noch an Deinen Code anpassen. Ich 
wollte das jetzt nicht alles hier zusammenschreiben - Informatiker sind faul ...  :wink: 


			
				Gast hat gesagt.:
			
		

> Also ich selektiere erst 6 Felder in einer Tabelle. Die können mehrere Sätze (Zeilen) haben.
> 1. Mit List a gründe ich eine ArrayList für das erste Feld, list b für zweite... d.h wenn ich 6 Felder selektiert habe,
> muss ich 6 ArrayList gründen, also bis List f???


 Genau so - also so viele Listen schreiben, wie Du Elemente hast. Das geht sicher auch noch besser - mir faellt
aber grad irgendwie nix ein... Ich wuerde die Listen aber nicht von a bis f durchgehend benennen - das macht's
arbeiten mit den Listen spaeter recht schwer und wenn Du irgendwann mal wieder in den Code guckst ist's auch net
so toll - also lieber sinnvolle Namen wie "auf001List" oder so verwenden


			
				Gast hat gesagt.:
			
		

> 2. ResultSet holt sich dann die Werte der ersten Zeile der 6 Felder und fügt en ersten Wert mit a.add in der ArrayList 1
> (also in meinem Fall in AUF001), richtig?? D.h ich muss auch bis f.add gehen...?


 Genau!


			
				Gast hat gesagt.:
			
		

> 3. Was macht aber das
> hashMap.put("KeyA", a);
> hashMap.put("KeyB", b);
> wofür steht "KeyA" in meinem Programm?


 Wenn ich's recht gesehen hatte, dann hast Du Deine Ergebnis-Werte
in eine HashMap geschrieben, richtig? Wollte damit einfach nur sagen, dass Du dann genauso weitermachst, wie Du's
schon hattest - eben einfach die Listen in die HashMap schreiben und Deine keys verwenden.[/quote]



			
				Gast hat gesagt.:
			
		

> 4. Da ich die Werte noch ausgeben möchte danach in einer JTextArea wollte ich auch für meine ArrayListen Header einfügen. Wie geht das?


Schande auf mein Haupt - aber ich habe nicht wirklich viel Ahnung von Swing etc...    Ich schreib's mir dann
irgendwie zusammen, wenn ich mal was damit machen muss...
Von daher - wozu willst Du den Header verwenden? Und welche Werte brauchst Du da?


----------



## Louis2 (10. Jun 2005)

So sieht im Moment mein Code aus (nach Änderung):

```
Statement auftrag = connection.createStatement(); 
resultauftrag = "SELECT AUF001, AUF012, AUF004, AUF015, AUF016, AUF020 FROM" + "Auftrag WHERE customerid='1619'"; 
ResultSet rs = auftrag.executeQuery(resultauftrag); 
connection.commit();
Map map = new HashMap(); 
List auf001 = new ArrayList(); 
List auf012 = new ArrayList();
List auf004 = new ArrayList(); 
List auf015 = new ArrayList();
List auf016 = new ArrayList(); 
List auf020 = new ArrayList();
while (rs.next()) 
{ 
    auf001.add(rs.getString(1)); 
    auf012.add(rs.getString(2)); 
    auf004.add(rs.getString(3)); 
    auf015.add(rs.getString(4));
    auf016.add(rs.getString(5)); 
    auf020.add(rs.getString(6));
} 
//hashMap.put("KeyA", a); 
//hashMap.put("KeyB", b);
//map.put("Auftragsnummer", auf001); 
//map.put("Kommunikationsnummer", auf012); 
//map.put("Gedruckt am", auf004); 
//map.put("Umsatzwert", auf015); 
//map.put("WE", auf016); 
//map.put("Zustand", auf020);
```



			
				bambi hat gesagt.:
			
		

> Wenn ich's recht gesehen hatte, dann hast Du Deine Ergebnis-Werte in eine HashMap geschrieben, richtig? Wollte damit einfach nur sagen, dass Du dann genauso weitermachst, wie Du's schon hattest - eben einfach die Listen in die HashMap schreiben und Deine keys verwenden.


Das verstehe ich immer noch nicht sorry. Was macht denn das map.put denn genau, denn wie es aussieht habe ich es falsch benutzt. Ich habe nämlich geglaubt, dass man damit für jede ArrayList ein Titel angibt, also für die ArrayList "auf001" den Titel "Auftragsnummer".
Die Werte, die ich mit der SQL Query rauskriege, die werden doch schon mit auf001.add(rs.getString(1)); in der jeweiligen ArrayList eingefügt, wofür brauche ich denn noch die HashMap eigentlich?? Nicht pflicht oder? 



			
				bambi hat gesagt.:
			
		

> Schande auf mein Haupt - aber ich habe nicht wirklich viel Ahnung von Swing etc...    Ich schreib's mir dann irgendwie zusammen, wenn ich mal was damit machen muss...
> Von daher - wozu willst Du den Header verwenden? Und welche Werte brauchst Du da?


Also die Sache ist die. Nachdem ich die Werte in einem Array gespeichert habe, will ich sie in einer JTextArea ausgeben lassen. Zur besseren Übersicht, möchte ich Header einfügen, also für (die Spalte) "AUF001" (DB Feld), Header "Auftragsnummer" usw... verstehst Du was ich meine?
------------------------------------------------------------
Auftragsnummer | Kommunikationsnummer |                      <---- Header
------------------- | ----------------------------- |-------- 
0000005             | 6667777                        |                      <---- Werte aus der DB (SQL Query)

So in etwa  :wink: 


Ach ja Zeile 7-12, da meckert das Programm immer noch, weil die List Eigenschaft sowohl von der java.awt.List aluch von der java.util.List Klasse kommen kann. 
Wie kann ich es ändern im Beispiel oben mit List auf020 = new ArrayList(); usw...?

Danke!

Gruss


----------



## bambi (11. Jun 2005)

Hab's nur noch mal zur Vollstaendigkeit hier ...

```
Statement auftrag = connection.createStatement();
resultauftrag = "SELECT AUF001, AUF012, AUF004, AUF015, AUF016, AUF020 FROM" + "Auftrag WHERE customerid='1619'";
ResultSet rs = auftrag.executeQuery(resultauftrag);
connection.commit();

java.util.List auf001 = new ArrayList();
java.util.List auf012 = new ArrayList();
java.util.List auf004 = new ArrayList();
java.util.List auf015 = new ArrayList();
java.util.List auf016 = new ArrayList();
java.util.List auf020 = new ArrayList();

while (rs.next())
{
    auf001.add(rs.getString(1));
    auf012.add(rs.getString(2));
    auf004.add(rs.getString(3));
    auf015.add(rs.getString(4));
    auf016.add(rs.getString(5));
    auf020.add(rs.getString(6));
}

Map map = new HashMap();
map.put("Auftragsnummer", auf001);
map.put("Kommunikationsnummer", auf012);
map.put("Gedruckt am", auf004);
map.put("Umsatzwert", auf015);
map.put("WE", auf016);
map.put("Zustand", auf020);
```
Also so wuerde ich es machen. Das Problem mit der "doppelten List" kannst Du (s.o.) loesen indem Du dann
den kompletten Namen schreibst

```
java.util.List auf001 = new ArrayList();
```

Mit dem restlichen Code meinte ich nur, dass Du Deine Werte ganz normal in die HashMap schreibst. Dann
brauchst Du auch nicht unbedingt einen Header. Bei der Ausgabe kannst Du dann ja die Keys der HashMap
auslesen und als Header-Werte verwenden.


----------



## Louis2 (11. Jun 2005)

Die Ausgabe&Header in JTextArea (Name "message") geht so?

```
java.util.List listauf001 = (java.util.List) map.get("Auftragsnummer"); 
java.util.List listauf012 = (java.util.List) map.get("Kommunikationsnummer"); 
java.util.List listauf004 = (java.util.List) map.get("Gedruckt am"); 
java.util.List listauf015 = (java.util.List) map.get("Umsatzwert"); 
java.util.List listauf016 = (java.util.List) map.get("WE"); 
java.util.List listauf020 = (java.util.List) map.get("Zustand"); 
String s; 
    for (int n=0;n<listauf001.size();n++) 
    { 
        s = (String) listauf001.get(n); 
        message.setText(s + "/n"); 
    }
```

1. Irgendwie erscheint aber -mit diesem Code- im Textfeld immer noch nichts, woran liegt es, wo ist der Fehler ?
1. Die for-Schleife wird aber nur die Liste für die erste Spalte gründen, d.h ich muss 6 verschiedene for-Schleifen benutzen oder geht die Ausgabe -Zeilenweise- (für alle Spalten) einfacher?
2. Damit es übersichtlich ist, muss ich ja noch ein bisschen HTML Code reinpacken... korrekt?


----------



## Louis2 (13. Jun 2005)

So sieht mein Code aus zum speichern im Array und dann auslesen:


```
try 
{ 
    String resultauftrag=new String();
    Class.forName("oracle.jdbc.driver.OracleDriver"); 
    //DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
    String url = "jdbc:oracle:thin:@"+DBServer+":1521:"+DBName; 
    Connection connection = DriverManager.getConnection(url, DBUser, DBPassword);
    connection.setAutoCommit(false);
                
    Statement auftrag = connection.createStatement(); 
    resultauftrag = "SELECT AUF001, AUF012, AUF004, AUF015, AUF016, AUF020 FROM Auftrag WHERE customerid='1619'"; 
    ResultSet rs = auftrag.executeQuery(resultauftrag); 
    connection.commit();
                
    java.util.List auf001 = new ArrayList(); 
    java.util.List auf012 = new ArrayList();
    java.util.List auf004 = new ArrayList(); 
    java.util.List auf015 = new ArrayList();
    java.util.List auf016 = new ArrayList(); 
    java.util.List auf020 = new ArrayList();
    while (rs.next()) 
    { 
        auf001.add(rs.getString(1)); 
        auf012.add(rs.getString(2)); 
        auf004.add(rs.getString(3)); 
        auf015.add(rs.getString(4));
        auf016.add(rs.getString(5)); 
        auf020.add(rs.getString(6));
    } 
    Map map = new HashMap(); 
    map.put("Auftragsnummer", auf001); 
    map.put("Kommunikationsnummer", auf012); 
    map.put("Gedruckt am", auf004); 
    map.put("Umsatzwert", auf015); 
    map.put("WE", auf016); 
    map.put("Zustand", auf020); 

    java.util.List listauf001 = (java.util.List) map.get("Auftragsnummer"); 
    java.util.List listauf012 = (java.util.List) map.get("Kommunikationsnummer"); 
    java.util.List listauf004 = (java.util.List) map.get("Gedruckt am"); 
    java.util.List listauf015 = (java.util.List) map.get("Umsatzwert"); 
    java.util.List listauf016 = (java.util.List) map.get("WE"); 
    java.util.List listauf020 = (java.util.List) map.get("Zustand"); 
    String outlist001; 
    String outlist012;
    String outlist004;
    String outlist015;
    String outlist016;
    String outlist020;
    for (int n=0;n<listauf001.size();n++) 
    { 
        outlist001 = (String) listauf001.get(n); 
        outlist012 = (String) listauf012.get(n); 
        outlist004 = (String) listauf004.get(n); 
        outlist015 = (String) listauf015.get(n); 
        outlist016 = (String) listauf016.get(n); 
        outlist020 = (String) listauf020.get(n); 

        message.append(outlist001 + " " + outlist012 + " " + outlist004 + " " + outlist015 + " " + outlist016 + " " + outlist020 + "\n"); 
        
    } 
}
```


1. Es werden keine Headers angezeigt, das "map.get" ist doch dafür da oder?
2. Gibt es eine Möglichkeit die ausgegebenen Daten schön dazustellen also tabellenmäßig, da es blöd aussieht wenn Daten in einer Spalte grösser sind als andere und mehr Platz nehmen z.B
KA0043 null null 100 
KA0063 2 null null 
KA1070 10 null 2350 

Ich habe "/t" benutzt sieht etwas besser aus aber immer noch verutscht, da ein Element mehr Platz braucht, kann man mit "/t" auch die Grösse festlegen?


----------



## bambi (13. Jun 2005)

Louis2 hat gesagt.:
			
		

> 1. Irgendwie erscheint aber -mit diesem Code- im Textfeld immer noch nichts, woran liegt es, wo ist der Fehler ?


Sollte aber eigentlich funktionieren. Versuch einfach mal die Daten mit System.out.println() auszugeben. Dann siehst Du ja, ob die Daten da sind.



			
				Louis2 hat gesagt.:
			
		

> 1. Die for-Schleife wird aber nur die Liste für die erste Spalte gründen, d.h ich muss 6 verschiedene for-Schleifen
> benutzen oder geht die Ausgabe -Zeilenweise- (für alle Spalten) einfacher?


Also eigentlich sollten ja alle Arrays gleich lang sein, oder? Da koenntest Du dann auch alles in einer Schleife ausgeben -
musst aber Exceptions abfangen, falls die Listen doch nicht gleich lang sind. Diese Loesung ist natuerlich sehr wackelig.
Am besten waer's hier vielleicht, wenn Du die Daten gar nicht erst in ArrayLists schreibst, sondern Dir JavaBeans
erstellst, die Du dann mit Deinen Daten fuellst. Das Ganze ist dann aber nicht besonders flexibel. Kommt eben darauf an,
was Du brauchst.
Man muss sich da meistens doch eintscheiden - guter Stil und sehr stabil oder ganz flexibel...

Ich wuerde auch immer listauf001.size() aus der Schleife rausnehmen. Das kann auch immer ein wenig mehr Zeit
kosten, wenn bei jedem Durchlauf noch mal die Laenge geholt werden muss.

```
String s; 
int len = listauf001.size();

    for (int n=0;n<len;n++) 
    { 
        s = (String) listauf001.get(n); 
        message.setText(s + "/n"); 
    }
```
setText() ueberschreibt immer den alten Text im Feld. Du haettest dann immer nur den Inhalt der letzten Stelle in der
List im Feld. Es gibt da sowas wie addText (bin mir nicht ganz sicher). Schau' einfach mal in die API.


----------



## bambi (13. Jun 2005)

> 1. Es werden keine Headers angezeigt, das "map.get" ist doch dafür da oder?


Nein. Das get(key) holt immer nur die Daten, die dem gegebenen key zugeordnet sind. Also Du musst den Key dann schon selber als Header setzen.
Falls Du mal was hast wo Du nicht genau weisst welche Keys Du hast, dann kannst Du mit ... durch die HashMap loopen.

```
HashMap map = new HashMap();

// Daten einfuegen
map...

// Daten auslesen
Set keySet = map.keySet();
Iterator keyIter = keySet.iterator();

String key = null;
String value = null;     
while (keyIter.hasNext())
{
   // get the key
   key = (String) keyIter.next();
   // get the value
   value = (String) map.get(key);
...}
```



> 2. Gibt es eine Möglichkeit die ausgegebenen Daten schön dazustellen also tabellenmäßig, da es blöd aussieht wenn Daten in einer Spalte grösser sind als andere und mehr Platz nehmen...


Du gibst Deine Daten ja in einem GUI aus, richtig? Also ich wuerde da in Deinem Fall nicht mit einem TextField arbeiten.
Da gibts eine Klasse JTable - oder so. Wie gesagt - GUIs sind nicht so mein Gebiet. Schau' da einfach mal in der Suche
hier oder ansonsten lieber jemand anderen fragen - sorry.


----------

