Datenbankabfragen

KaffeeFan

Bekanntes Mitglied
Hey Leute,

habe vorgestern angefangen Datenbanken in Java einzubinden, allerdings bin ich gerade auf ein Problem gestoßen. Und zwar wenn ich die Tabelle2 auslesen will, schmeißt er mir das "Öffnen fehlgeschlagen!".
Muss man irgendwie erst die Connection schließen oder so? :confused:

Java:
package datenbanktest;

import java.sql.*;

public class DatenbankTest {
  public static void main(String[] args) throws SQLException, ClassNotFoundException {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection con = null;
    System.out.println("Tabelle1 : \n");

    try {
      con = DriverManager.getConnection("jdbc:odbc:Datenbank1", "Benutzer", "Passwort");
      String query = "SELECT * FROM Tabelle1";
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(query);
      while (rs.next()) {
        String controller = rs.getString("Controller");
        double preis = rs.getDouble("Preis");
        int menge = rs.getInt("Menge");
        String standort = rs.getString("Standort");

        System.out.println("Produkt  : " + controller + "\n"
                + "Preis    : " + preis + " €\n"
                + "Menge    : " + menge + "\n"
                + "Standort : " + standort);
      }

      System.out.println("\nTabelle2 : ");
      String querry = "SELECT * FROM Tabelle2";
      Statement stnt = con.createStatement();
      ResultSet rss = stnt.executeQuery(querry);
      while (rss.next()) {
        String name = rss.getString("Name");
        String vorname = rss.getString("Vorname");
        String geschlecht = rss.getString("Geschlecht");
        int alter = rss.getInt("Alter");
        int geburtstag = rss.getInt("Geburtstag");
        String ort = rss.getString("Ort");

        System.out.println("Name       : " + name + "\n"
                + "Vorname    : " + vorname + "\n"
                + "Geschlecht : " + geschlecht + "\n"
                + "Alter      : " + alter + "\n"
                + "Geburtstag : " + geburtstag + "\n"
                + "Ort        : " + ort);
      }
    } catch (SQLException e) {
      System.out.println("Öffnen fehlgeschlagen!");
    }  finally {
      if (con != null) {
        try {
          con.close();
        } catch (SQLException e) {
          System.out.println("Schließen fehlgeschlagen!");
        }
      }
    }
  }
}
 
Zuletzt bearbeitet von einem Moderator:

Dukel

Top Contributor
Die Connection kannst du offen lassen, das Statement sollte man schließen (oder ein neues aufmachen, dabei sollten dann zum Schluss aber beide geschlossen werden).
 

Dompteur

Top Contributor
Du hast hier einen folgeschweren konzeptionellen Fehler in deinem Code: Dein System liefert dir den Grund, warum dein Programm nicht läuft und du ignorierst ihn.

Daher: Exceptions enthalten wertvolle Informationen. Diese sollten zumindest ausgegeben/geloggt werden. Wenn du das beherzigst, wirst du dir in Zukunft viel Zeit bei der Fehlersuche sparen...

Erweitere dein Programm an der Stelle:
Java:
    catch (SQLException e)
     {
       System.out.println("Öffnen fehlgeschlagen!");
       e.printStackTrace();
     }
 

KaffeeFan

Bekanntes Mitglied
Ich hatte vorher auch jede Spalte einzeln geschrieben, dann hatte ich im Internet gesehen, dass es so auch geht und ich dachte ich kann mir ersparen Spalte für Spalte zu schreiben...
Wieso ist das ein NoGo?
 

Thallius

Top Contributor
Weil Du damit keine Kontrolle hast wenn sich die DB mal ändert. Wenn eine Spalte dazu kommt oder eine wegfällt oder umbenannt wird, bekommst du nur merkwürdige Ergebnisse aber keine Fehler. Ausserdem ist es für andere unmöglich zu lesen was Du da machst, ausser er sucht sich selber das DB shema raus.

Weiterhin zeugt es meist von einem Design-Fehler wenn man alle Spalten aus einer Tabelle lesen muss. Ich habe z.B. in fast jeder Tabelle eine Spalte registered und changed um zu loggen wann welcher Datensatz angelegt und geändert wurde. Das will man in der Regel aber gar nicht in einer Abfrage zurück bekommen die für den User irgendwelche Anzeigen macht.

Gruß

Claus
 
Zuletzt bearbeitet von einem Moderator:

KaffeeFan

Bekanntes Mitglied
Ahaaa okay, ja klingt logisch!

Werde es in Zukunft berücksichtigen, danke dir!

Hab noch eine weitere Frage...
Und zwar habe ich gerade auf Java 8 geupdatet, d.h. mein Programm sollte eigentlich nicht mehr laufen, da die JDBC/ODBC-Bridge in Java 8 entfernt wurde, richtig?
Allerdings wird es genauso ausgeführt wie vorher...

Gruß
Lukas
 

Saheeda

Top Contributor
In Ergänzung zu Thallius eine andere Variante:

Bei uns auf Arbeit haben wir zum einen Domain-Objekte, welche _alle_ Daten enthalten und tatsächlich über SELECT * ausgelesen werden können.
Zum anderen arbeiten wir mit DTOs (Data-Transfer-Objects), welche nur genau das enthalten, was an den User rausgehen soll.
In Thallius' Beispiel hätte unser Domain-Objekt also auch ein Feld "changed", das DTO aber nicht, da diese Info nicht für den User bestimmt ist.
 

Joose

Top Contributor
Ergänzend zu beiden Aussagen: Es hat je nach Anwendungsfall auch etwas mit der Performance zu tun. Ob ich jetzt nur 2 Spalten selektiere die ich brauche oder alle und da 98 unnötig dabei sind macht auch einen Unterschied. Natürlich müssen diesen Daten auch übertragen werden.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben