2dimensionale Hashtable

Status
Nicht offen für weitere Antworten.

erik.rostock

Mitglied
Hallo,
ich habe mir eine Klasse geschrieben, mit der ich SELECT-Queries ausführen kann. Die Funktion executeQuery, soll ein Array zurückgeben, wobei jeder Arrayeintrag eine Zeile des Queryresults repräsentiert, und somit wieder ein Array sein muss, da ich den Namen der Spalte auch zurückbekommen will, also z.B. so:

Code:
 Tabelle table1 in MySQL:

 | spalteA | spalteB |
+ ---------- + ---------- +
 |  foo       |    bar    |
 |  xyz      |    123   |
Code:
 Rückgabearray des Statements SELECT * FROM table1; :

String str = result[0]["spalteA"] //str = foo
String str = result[0]["spalteB"] //str = bar
String str = result[1]["spalteA"] //str = xyz
String str = result[1]["spalteB"] //str = 123
Das geht in JAVA natürlich nicht, aber so weiss hoffentlich jeder was ich als Rückgabe benötige. Um also ein mehrdimensionales Array mit Strings als Schlüsseln zu relisieren, habe ich folgendes probiert:

Code:
public Hashtable<Number, Hashtable<String, String>> executeQuery(String query)
{
    Hashtable<Number, Hashtable<String, String>> sqlResult = new Hashtable<Number, Hashtable<String, String>>();
    Hashtable<String,String> row = new Hashtable<String,String>();
    while(zeilen vorhanden)
    {
        row.clear();
        while(spalte in aktueller zeile)
        {
            row.put(spaltenname, wert)
        }
        sqlResult.put(aktuelle zeile, row)
    }
}

Das ganze sieht dann bei mir in JAVA so aus:
Code:
    public Hashtable<Number, Hashtable<String, String>> executeQuery(String query) {
        Hashtable<Number, Hashtable<String, String>> sqlResult = new Hashtable<Number, Hashtable<String, String>>();
        Hashtable<String,String> row = new Hashtable<String,String>();
        ResultSet result = null;       
        int rowNum = 0;
        try {
            Statement st = this.conn.createStatement();
            result = st.executeQuery(query);
            ResultSetMetaData rsmd = result.getMetaData();

            while (result.next())
            {
                row.clear();
                for (int i = 1; i <= rsmd.getColumnCount(); i++)
                {
                    row.put("["+rowNum+"]"+rsmd.getColumnName(i), result.getString(i)+"
");
                }
                this._debug += row+"
";
                sqlResult.put(rowNum, row);
                rowNum++;
            }
        }
        catch (SQLException e)
        {
            this.lastError = e;
        }

        return sqlResult;
    }

Das funktioniert auch alles soweit gut, ich bekomme auch eine zweidimensionale Hashtable zurück, so gross wie sie sein muss, doch leider sind immer die gleichen Zeilen vorhanden(und nciht unterschiedliche so wie es sein müsste, d.h. wenn in der DB 10 unterschiedliche Datensätze sind, bekomme ich 10 mal den gleichen zurück).
Ich habe mal alle Datensätze in ein String geschrieben und mir den ausgeben lassen. Hier sind alle Datensätze vorhanden, deshalb gehe ich davon aus das irgendwo ein Problem beim Umgang mit den hashtables besteht.
Ich hoffe ihr könnt mir helfen und ich habe mich verständlich ausgedrückt.

erik.rostock[/code]
 

thomator

Bekanntes Mitglied
Lass mich mal raten: es ist immer der letzte Datensatz, der in den rows steht, oder?
Du verwendest immer wieder die Referenz auf den gleichen Hashtable. Heißt: Du speicherst 10mal die gleiche Referenz unter verschiedenen Keys.
Du musst in der Schleife row nicht nur clearen, sondern mit new Hashtable ein neues Objekt instanziieren.

EDIT: die schon im Hashtable vorhandenen Objekte gehen ja nicht verloren, da über den Hashtable noch Referenzen drauf existieren.

und noch mal EDIT: wenn ich das mit dem Fehlerhandling sehe sag ich mal: gefährlich. Wenn konkurrierende Prozesse auf die Methoden für die Datenbankabfragen zugreifen bekommst Du evtl. bei der Abfrage der letzten Fehlermeldung nicht das erwünschte Ergebnis...
 
B

bygones

Gast
n hashtable nur um 2 strings zu speicher ? seh ich das richtig ?

mach dir n eigenes objekt dass dies speichert, dann brauchst du auch nicht ein mischmasch von hashtables....
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben