JDBC und JTable. Datensätze korrekt einlesen schlägt fehl. Hilfe.



  • Hallo,

    habe folgendes Problem und hoffe mir kann wer helfen. Mein Lehrer hat mir folgende Aufgabenstellung gegeben, die ich leider beim besten Willen nicht lösen kann. Es ist ganz dringend. 😮

    Eine MS Acces Datenbank enthält eine Tabelle mit folgenden Daten

    Kundennr, Firma

    Es sollen beliebig viele Tupel hinzuzufügen sein und beliegt viele weitere Spalten(Attribute) wie z.B. Vorname, Nachname.

    Es soll über JDBC erstmal eine einfache Verbindung zur Datenbank hergestellt werden, die automatisch beim Programmstart aufgerufen wird und alle Datensätze in ein ResultSet einliest. Das ist soweit kein Problem.

    try{
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }catch (ClassNotFoundException e){
       System.err.println("Treiber nicht gefunden" +e);
    }
    try{
       Connection con = DriverManager.getConnection(
             "jdbc:odbc:Kunden", "User", "User"
       );
       Statement stm = con.createStatement();
       ResultSet set = stm.executeQuery("SELECT * FROM Kunden");
       //hier kommt nachher das Problem
    }catch (SQLException e2){
       while(ex2 != null) {
          System.err.println(e2);
          e2.getNextException();
       }
    }
    

    Das ResultSet soll in ein mehrdimensionales Array eingelesen werden und an den Konstruktor einer JTable als Argument übergeben werden (im Schritt davor haben wir es mit Konstanten gemacht, das funktionierte, ist aber praxisfern und war nur zum üben)

    public static final String[][] DATA = {
        {"0001","Musterfirma", "Mustermann","Hans"},
        ....
    };
    
    public static final String[] HEAD = {
        "Kundennr","Firma", "Nachname", "Vorname"
    }; 
    /*Das die Köpfe statisch sind und wenn mehr Spalten in der DB
    dazukommen, manuell geändert werden müssen, soll erstmal so bleiben.*/
    

    Beim einlesen des ResultSet soll es erstmal bei einem zweidim. Array bleiben. Keine Vektoren und keine anderen komplexen Strukturen aus den Collections! Das ist ganz wichtig bei der Aufgabe. Soll erstmal die Bordmittel üben.Die Größe des Arrays soll auch erstmal statisch sein und bei zu vielen Datensätzen manuell im Quelltext geändert werden (System.arrayCopy... für dynamische Größenanpassung kommt später) Mein Ansatz:

    ResultSet set = stm.executeQuery("SELECT * FROM Kunden");
    String[][] data = new String[50][5];
    int a = 0;
    int b = 0;
    while(rSet.next()){
        data[a][b] = rSet.getString("Kundennr");
        data[a][b+1] = rSet.getString("Firma");
        a++;
    }
    JTable table = new JTable(data, HEAD);
    this.getContentPane().add(...........
    

    Das funktioniert erstmal, ist aber wohl eine nicht gelungene Lösung.
    Das a hochgezählt wird ist meines erachtens in Ordnung, aber b muss immer gesagt werden, aus welcher Spalte gelesen werden soll.

    Ich möchte das so haben, dass meine Programm automatisch erkennt wie das ResultSet aufgebaut ist, z.B. dass die Spalte Nachname noch in der DB ist und entsprechend auf mit der Variablen b reagiert. Kann mir wer helfen? 😞



  • Du musst dazu also im vornherein wissen, wieviel Spalten die DB hat, oder?
    Vielleicht helfen Dir da die Metadaten einer DB weiter.

    DatabaseMetaData meta = con.getMetaData();
    // leider gibt es nicht sowas wie getColumnCount(), deswegen:
    ResultSet columns = meta.getColumns(null, "%", tableName, "%");
    

    Aus dem ResultSet kannst Du Dir dann versch. Infos über die Spalten geben lassen...z.B. sowas:

    String columnName = columns.getString("COLUMN_NAME");
    String datatype = columns.getString("TYPE_NAME");
    int datasize = columns.getInt("COLUMN_SIZE");
    

    Oder einfach nur in der Schleife, die das ResultSet durchgeht eine Var hochzählen, wenn Du nur die Anzahl der Spalten wissen willst.



  • Oh, ich habe grade gesehen, dass Du Dir auch direkt aus dem ResultSet mit getMetaData() die Metadaten zur Tabelle holen kannst. Da gibts dann auch getColumnCount() ...

    Das ist anscheinend weniger umständlich...


Anmelden zum Antworten