DB Inhalt in JTextField

The_Answer1985

Erfahrenes Mitglied
Hallo zusammen,

ich habe eine GUI, in der ein Formular enthalten ist. Die Textfelder des Formulars sollen dazu dienen, neue Datensätze in der Datenbank anzulegen und vorhandene anzuzeigen.

Wenn das Programm gestartet wird, soll der erste Datensatz in den Textfeldern erscheinen. Durch Buttons sollen dann die weiteren Datensätze "durchgeschaltet" werden können.

Das ist mein Problem:
Ich hab keinen Lösungsansatz, wie ich einen einzelnen Datensatz in verschiedene Textfelder ablege.

Ich habe eine Methode, die Verbindung zur DB aufnimmt und ein ResultSet zurückliefert. Wie kann ich jetzt über das ResultSet nur einen Datensatz wählen um ihn in den Textfeldern anzuzeigen?
Wie kann ich realisieren, das per Button zum nächsten Datensatz geschalten werden kann (also, dass auch wirklich der nächste Datensatz angezeigt wird)?

Vielen Dank für jede Hilfe!

MfG
 
Hallo,

eine Idee wäre mal, dass du dir eine Klasse schreibst, die einen Datensatz repräsentiert.
Also wenn die Tabelle eine Spalte mit Vorname und eine Spalte Nachname hat würde die Klasse so aussehen.

Java:
public class Datensatz{

private String name;

private String vorname;

//jetzt würden die getter und setter kommen

}

Aus deinem ResultSet nimmst du den ersten Datensatz und schreibst die Werte in ein Object der Datensatz-Klasse. Das Object kannst du dann in einer Liste(z. B. ArrayList) speichern. Das machst du dann für alle Datensätze.

Dann kannst du ganz einfach mit dem Index auf die Datensätze in der Liste zugreifen und kannst die über den entsprechenden Getter einen Wert aus dem Datensatz-Object auslesen und es mit setText() ins Textfeld schreiben.

Ich hoffe ich hab mich verständlich ausgedrückt.

MFG

zEriX
 
Ok, für mein Verständnis :)

ich schreib ne eigene Klasse
und speicher in einem Objekt den Datensatz des RS
die Objekte wiederum speicher ich in ner Liste
und kann sie dann via ID voneinander unterscheiden.

wenn ichs richtig versteh hört es sich nach ner guten Idee an ;)
 
Mit Index meinte ich den Index in der Liste. Du kannst mit den Buttons zum hin und her schalten einfach den Index hochzählen und den Datensatz an der Stelle aus der Liste auslesen.

MFG

zEriX
 
Ich hab jetzt mal versucht, deinen Vorschlag umzusetzen:

Die Klasse, die einen Datensatz repräsentiert:
HTML:
public class DBDatensatz {

    DBZugriff einZugriff;
    
    public int ID;
    public int kdNr;
    public String name;
    
    public int getID(){
        return ID;        
    }
    public void setID(int neueID){
        this.ID = neueID;
    }
    
    public int getkdNr(){
        return kdNr;
    }
    public void setkdNr(int neueNr){
        this.kdNr = neueNr;
    }
        
    public String getName(){
        return name;
    }
    public void setName(String neuerName){
        this.name = neuerName;
    }    
}

Die Methode, die das ResultSet in einer ArrayList mit Objekten vom Typ DBDatensatz speichert
HTML:
 public ArrayList leseFormular() throws SQLException{

        ArrayList<Object> datensaetze = new ArrayList<Object>();
        try{
            einZugriff = new DBZugriff();
            ResultSet ergebnis  = einZugriff.DBlesen("SELECT * FROM KUNDE");
                        
            for(int i = 0; i < ergebnis.getRow(); i++){
                
                DBDatensatz einDatensatz = new DBDatensatz();
                
                einDatensatz.setID(i);
                einDatensatz.setkdNr(ergebnis.getInt("KdNr"));
                einDatensatz.setName(ergebnis.getString("Name"));
                einDatensatz.setStrasse(ergebnis.getString("Strasse"));
                einDatensatz.setHausNr(ergebnis.getString("HausNr"));
                einDatensatz.setPlz(ergebnis.getInt("Plz"));
                einDatensatz.setOrt(ergebnis.getString("Ort"));
                einDatensatz.setLand(ergebnis.getString("Land"));
                einDatensatz.setTel(ergebnis.getString("Telefon"));
                einDatensatz.setFax(ergebnis.getString("Telefax"));
                                
                datensaetze.add(einDatensatz);    
                
            }
        }
        catch(SQLException e){
                e.printStackTrace();
        }
        
        if(datensaetze == null){
            System.out.println("Der Datensatz ist leer");
        }
        return datensaetze;
        
    }

Und jetzt weiss ich nicht mehr weiter... wie kann ich jetzt auf die einzelnen Elemente in der ArrayList zugreifen.
Da sind ja jetzt ne Reihe von Datensätzen drin, denen ich zur Identifikation die ID (i, der Zähler der for-Schleife) zugewiesen hab.
Wie kann ich die einzelnen Datensätze jetzt rausholen und dem Textfeld zuweisen?

Liebe Grüße
 
Mir stellen sich gerade 2 Fragen. Weißt du wie man über eine Liste iteriert? Weißt du wie man was in ein TextFeld schreibt?

Wenn du das nicht wissen solltest, dann solltest du dir echt mal die Grundlagen anschauen.

Der Datensatz braucht bei dir keine ID.

So bekommst du Werte aus der Liste und kannst irgendwas in ein Textfeld schreiben.
Java:
ArrayList list = new ArrayList();
JTextField tf = new JTextField();
list.add("test");
tf.setText(list.get(0));


Bei ließt du halt so einen Datensatz aus und musst dann über die getter die Werte auslesen.

MFG

zEriX
 
Mir stellen sich gerade 2 Fragen. Weißt du wie man über eine Liste iteriert? Weißt du wie man was in ein TextFeld schreibt?

Ja weiss ich, hab Iterator leider nur bisher selten benutzt...und mit ArrayList hab ich auch schon ne Weile net mehr gearbeitet. Sind so ein bisschen die Basics verloren gegangen... :eek:

Mein Problem war ja, dass sich in der Liste nicht gleich die einzelnen Elemente eines Datensatzes befinden, sondern erst der komplette Datensatz. Aber da du Iterator ansprichst... ist meine Frage damit beantwortet :)

aber danke, für deine Hilfe, auch wenn meine Frage frustrierend sein mögen... :)

liebe Grüße
 
Zuletzt bearbeitet:
Du wirst nicht mit dem Iterator drauf zugreifen, da du ja mit Buttons hin und her navigieren möchtest. Da ist es sinnvoller das ganze mit get() und einem Counter zu lösen. Den Counter kannst du dann immer hochzählen bzw runterzählen, wenn du auf die Buttons klickst. Dort könntest du dann eine Methode aufrufen der du einfach deinen Counter übergibst.
In dieser Methode liest du dann mit get() den entsprechenden Datensatz aus und befüllst die Textfelder.

Meine Bemerkung oben war nicht böse gemeint, sondern eher als rat gedacht. Da Listen oder ähnliches eigentlich sehr häufig genutzt wird und da sollte man dann schon wissen wie man sowas umsetzt.

MFG

zEriX
 
Habs auch eher als konstruktive Kritik gesehn als es böse genommen zu haben ;)
außerdem lernt man aus Fehlern!

Ich poste mal mein bisheriges Ergebnis (i. d. Hoffnung nen weiteren Fehler beheben zu können)

Methode für DB-Zugriff und Speicherung der Datensätze:
HTML:
public ArrayList DBlesen() throws SQLException{
  try 
  {
    String befehl = "SELECT * FROM KUNDE";
    statement = connection.createStatement();
    result = statement.executeQuery(befehl);
    
       ArrayList<Object> datensaetze = new ArrayList<Object>();
       if(result != null){
        
        int count = 0;
          
         while(result.next()){ 
           
           count++;
           DBDatensatz einDatensatz = new DBDatensatz();
               
           einDatensatz.setkdNr(result.getInt(1));
           einDatensatz.setName(result.getString(2));
           einDatensatz.setStrasse(result.getString(3));
           einDatensatz.setHausNr(result.getString(4));
           einDatensatz.setPlz(result.getString(5));
           einDatensatz.setOrt(result.getString(6));
           einDatensatz.setLand(result.getString(7));
           einDatensatz.setTel(result.getString(8));
           einDatensatz.setFax(result.getString(9));
           
           datensaetze.add(einDatensatz); 
          }
         }
    return datensaetze;
  } 
  
  catch (SQLException ex1) 
  {
    System.out.println("Es ist ein Fehler aufgetreten: " + ex1.getMessage());
  }
  
  return null; 
 }

Methode zum Anzeigen der Daten in den Textfeldern:
HTML:
public void datenAnzeigen() throws SQLException{
     
     // ArrayList der Datensaetze aus ResultSet
     ArrayList datensaetze = einZugriff.DBlesen();
     Object einDatensatz = datensaetze.get(0);
  String kdnr = String.valueOf(((DBDatensatz) einDatensatz).getkdNr());
  tfKdNr.setText(kdnr);
  
  String name = String.valueOf(((DBDatensatz) einDatensatz).getName());
  tfName.setText(name);
  
  String strasse = String.valueOf(((DBDatensatz) einDatensatz).getStrasse());
  tfStrasse.setText(strasse);
  
  String hausNr = String.valueOf(((DBDatensatz) einDatensatz).getHausNr());
  tfHausNr.setText(hausNr);
  
  String plz = String.valueOf(((DBDatensatz) einDatensatz).getPlz());
  tfPlz.setText(plz);
  
  String ort = String.valueOf(((DBDatensatz) einDatensatz).getOrt());
  tfOrt.setText(ort);
  
  String land = String.valueOf(((DBDatensatz) einDatensatz).getLand());
  tfLand.setText(land);
  
  String telefon = String.valueOf(((DBDatensatz) einDatensatz).getTel());
  tfTelefon.setText(telefon);
  
  String fax = String.valueOf(((DBDatensatz) einDatensatz).getFax());
  tfFax.setText(fax);
  
     
    }

Methoden für die Cursor (funktionieren nocht nicht 100%...):
HTML:
public void letzterDatensatz(){
     
     ArrayList datensaetze = null;
  try {
   datensaetze = einZugriff.DBlesen();
  } catch (SQLException e) {
   e.printStackTrace();
  }
     
     if(datensatzCounter == 0){
      JOptionPane.showMessageDialog(this, "Zurück nicht möglich. Erster Datensatz bereits erreicht!");
     }
     else{
      datensatzCounter--;
         Object einDatensatz = datensaetze.get(datensatzCounter);
         
      String kdnr = String.valueOf(((DBDatensatz) einDatensatz).getkdNr());
      tfKdNr.setText(kdnr);
      
      String name = String.valueOf(((DBDatensatz) einDatensatz).getName());
      tfName.setText(name);
      
      String strasse = String.valueOf(((DBDatensatz) einDatensatz).getStrasse());
      tfStrasse.setText(strasse);
      
      String hausNr = String.valueOf(((DBDatensatz) einDatensatz).getHausNr());
      tfHausNr.setText(hausNr);
      
      String plz = String.valueOf(((DBDatensatz) einDatensatz).getPlz());
      tfPlz.setText(plz);
      
      String ort = String.valueOf(((DBDatensatz) einDatensatz).getOrt());
      tfOrt.setText(ort);
      
      String land = String.valueOf(((DBDatensatz) einDatensatz).getLand());
      tfLand.setText(land);
      
      String telefon = String.valueOf(((DBDatensatz) einDatensatz).getTel());
      tfTelefon.setText(telefon);
      
      String fax = String.valueOf(((DBDatensatz) einDatensatz).getFax());
      tfFax.setText(fax);
         
      
     }
     
    }
    
    public void naechsterDatensatz(){
     
     ArrayList datensaetze = null;
  try {
   datensaetze = einZugriff.DBlesen();
  } catch (SQLException e) {
   e.printStackTrace();
  }
  
  System.out.println("Array:" + datensaetze.size());
  System.out.println("Counter:" + datensatzCounter);
     if(datensatzCounter >= datensaetze.size()){
      JOptionPane.showMessageDialog(this, "Weiter nicht möglich. Letzter Datensatz bereits erreicht!");
     }
     else{
      datensatzCounter++;
         Object einDatensatz = datensaetze.get(datensatzCounter);
         
      String kdnr = String.valueOf(((DBDatensatz) einDatensatz).getkdNr());
      tfKdNr.setText(kdnr);
      
      String name = String.valueOf(((DBDatensatz) einDatensatz).getName());
      tfName.setText(name);
      
      String strasse = String.valueOf(((DBDatensatz) einDatensatz).getStrasse());
      tfStrasse.setText(strasse);
      
      String hausNr = String.valueOf(((DBDatensatz) einDatensatz).getHausNr());
      tfHausNr.setText(hausNr);
      
      String plz = String.valueOf(((DBDatensatz) einDatensatz).getPlz());
      tfPlz.setText(plz);
      
      String ort = String.valueOf(((DBDatensatz) einDatensatz).getOrt());
      tfOrt.setText(ort);
      
      String land = String.valueOf(((DBDatensatz) einDatensatz).getLand());
      tfLand.setText(land);
      
      String telefon = String.valueOf(((DBDatensatz) einDatensatz).getTel());
      tfTelefon.setText(telefon);
      
      String fax = String.valueOf(((DBDatensatz) einDatensatz).getFax());
      tfFax.setText(fax);
      
     }
     
    }

Ok...schließlich zu meinen Problemen:

- die Cursor-Buttons zum Vor- und Zürckschalten der Datensätze funktionieren leider noch nicht richtig... steig da grad nicht dahinter!

- hab das ganze jetzt unter Wettkampfbedingungen getestet (der schließlich zur Einsatz kommen DB):
Hier tritt das Problem auf, dass ich eine rießige Meldung erhalte, dass ich zu viele Client-Tasks beim Zugriff auf die Datenbank per JDBC-ODBC habe.
Vielleicht findet jm. von euch den Fehler im Code...

Vielen Dank im Vorraus...
und ein großes DANKE an zerix für deine tolle Idee

Liebe Grüße
 
Thema hat sich erledigt, hab noch ein überflüssiges Code-Schnipsel entdeckt!

Also der obige Quellcode kann/soll all denjenigen dienen, die mal in die selbe Situation kommen könnten!

Vielen Dank für die Hilfe!

Liebe Grüße
 
Zurück