# Ausgabe nur bestimmter Daten



## Zakon (14. Dez 2020)

Hallo ich Programmiere gerade mit JavaFX und SceneBuilder ein Programm zur abfrage und änderung meiner Daten in der Datenbank.
Wenn ich ein SELECT X FROM Y mache dann bekomme ich eine Fehlermeldung, dass die Datenumwandlung nich gekalppt hat.


```
@FXML
    public void select(ActionEvent event) {
        Connection conn = DBConnection.getInstance().getCon();
        String auswahlEingabe = Auswahl.getText();
        String fromEingabe = Tabelle.getText();
        try {
            data = FXCollections.observableArrayList();
            ResultSet rs = conn.createStatement().executeQuery("SELECT "+ auswahlEingabe +" FROM "+ fromEingabe );
            while (rs.next()) {
                data.add(new UserDetails(rs.getInt(1),rs.getString(2), rs.getString(3), rs.getInt(4)));
            }
            rs.close();

            if (conn != null && conn.isClosed()) {
                System.out.println("Connected");
            } else {
                System.out.println("Connection lost");
            }
        } catch (SQLException s) {
            System.out.println("Error " + s);
        }

        columnMitarbeiter_ID.setCellValueFactory(new PropertyValueFactory<>("Mitarbeiter_ID"));
        columnVorname.setCellValueFactory(new PropertyValueFactory<>("Vorname"));
        columnNachname.setCellValueFactory(new PropertyValueFactory<>("Nachname"));
        columnFirmen_ID.setCellValueFactory(new PropertyValueFactory<>("Firmen_ID"));

        tableUser.setItems(null);
        tableUser.setItems(data);
    }
```

Ich glaube auch das der Fehler in der While schleife liegt da wenn ich zb den Vorname abfrage er zuerst über 1 geht bedeutet die Mitarbeiter_ID.
Nur ist mir nicht ganz klar wie ich das ganze so schreibe das ich nur das bekomme was ich möchte.

Danke im vorraus für eure Hilfe


----------



## Oneixee5 (14. Dez 2020)

Wenn du "SELECT X FROM Y" abfragst, dann erhältst du eine Spalte "X" aber du versuchst 4 Spalte abzufragen: rs.getInt(4). Du kannst über ResultsetMataData rausbekommen wie das ResultSet aufgebaut ist, Spaltenzahl und Typen. Datenbankverbindungen sind übrigens native Ressourcen und es ist notwendig, dass diese nach Verwendung explizit geschlossen werden.


----------



## Zakon (14. Dez 2020)

Danke für den Tipp schonmal.

Mir ist irgenwie trozdem nicht ganz klar wie ich dann die Ausgabe bzw die tabelle so asugeben lassse wie ich sie brauche 🤔


----------



## Oneixee5 (14. Dez 2020)

Versuch mal "select spalte1, spalte2, spalte3, spalte4 from tabellenname". Die Bezeichner musst du natürlich an deine Tabelle anpassen.


----------



## Zakon (15. Dez 2020)

```
void select(ActionEvent event) throws SQLException {
        Connection conn = DBConnection.getInstance().getCon();
        String auswahlEingabe = Auswahl.getText();
        String fromEingabe = Tabelle.getText();
        try{
            ResultSet rs = conn.createStatement().executeQuery("SELECT "+ auswahlEingabe + " FROM " +fromEingabe);
            ResultSetMetaData meta =rs.getMetaData();
             int nummer = 0;

             for(int i = 1; i <= meta.getColumnCount();i++){
                 System.out.println(meta.getColumnLabel(i));
                 if(meta.isSigned(i)) {
                     nummer++;
                 }
                 System.out.println("Spalten: "+meta.getColumnCount()+", Nummer: "+nummer);
                 System.out.println();
             }
        }finally {
            conn.close();
```
Habe das ganze jetzt so und bekomme halt aus welchen Namen die Saplten haben und wei viele es gibt.
Ich möchte ja aber rausbekommen, wenn ich z.B. dann in mein Scene Builder SELECT Name FROM Mitarbeiter eingebe, dass der mir dann auch nur die Namen ausgibt und nicht die "Eigenschaften" der Tabelle 🤔


----------



## mrBrown (15. Dez 2020)

Als Frage vorneweg: Die Grundlagen hast du drauf, vor allem auch sowas wie Objekte und das vermeiden von `static`?


Wenn du die Query "im Scene Builder eingibst", dann schreib stattdessen eine Methode, die genau das zurückgibt, was du brauchst, und schreib die Query nicht irgendwo hin – und wenn der Benutzer das über die GUI eingeben soll, mach das auch.

Nur wenn das der Benutzer wirklich auf jeden Fall ohne Alternative eine Query eingeben soll: du kannst natürlich ganz normal das ResultSet nutzen, wie du es vorher auch gemacht hast. Es gibt dann halt nur einen einzigen Rückgabewert, und nicht vier, wie du in deinem Beispiel open erwartet hast. Der Nutzer macht dabei dann aber potentiell die Datenbank kaputt.
Oben gehst du einfach davon aus, dass es 4 Spalten im Ergebnis gibt, "SELECT Name FROM Mitarbeiter" gibt aber eben nur eine Spalte zurück – das wäre alles, was du dafür anpassen müsstest.


----------



## Zakon (15. Dez 2020)

Hallo danke für die Antowrten. Ich habe nicht ganz nachgedacht das Programm soll für jemanden sein der die Datenbank nicht kennt bedeutet er kann keine Querry eingeben. Deswegen mache ich das ganze jetzt mit einem DropDown Menü


----------

