Zugriff auf eine Postgresql-DB mit Java

ich arbeite mit Eclipse (Java 1.6) mit Postgresql.8.4.4 Linux (Betriebssystem Opensuse 11.2). Installiert habe ich Postgresql (Install and Configure PostgreSQL in openSUSE 11.0 | SUSE & openSUSE) und anschließend user und Datenbank mit pgAdmin3 angelegt. Jetzt will ich mit Java auf diese DB zugreifen (Insert, Update, Delete). Habe dafür postgresql.8.4.701.jdbc4.jar in Eclipse als Library eingebunden. Beim Starten der Oberfläche gibt er mir aus: Verbindung aufgebaut und nach dem SQL-Befehl org.postgresql.util.PSQLException: FEHLER: Relation Tabelle existiert nicht.
Auf einigen Webseiten wird angegeben, den Postmaster zu starten. Aber auch damit geht es nicht. Der SQL-Befehl wird in pgAdmin ohne Probleme ausgeführt. Ich habe die jar nach /usr/share/java kopiert. Aber auch das brachte nichts. Wer kann mir helfen?

Die Tabelle(n) die in Deinem SQL verwendet werden, gibt es nicht auf dem Server.

Hast Du die vorher auch angelegt?

Wie sieht das CREATE TABLE der Tabelle aus?
Wie sieht Dein SELECT (oder UPDATE, …) aus?

Ich habe die Tabelle mit Create table tabellenname (Attribute); Commit; einschließlich der Constraints über sql-Script von pgAdmin3 angelegt. Besitzer der Tabellen ist der von Java angesprochene User. Die SQL-Befehle in Java-Script funktionieren wenn ich sie bei pgAdmin direkt starte, es wird eingefügt, geändert oder entsprechende Daten ausgelesen.

Kannst du die exakten Befehle hier kopieren? Setze diese bitte in [ code ] und [ / code ] Tags (jeweils ohne Leerzeichen).
Bitte auch auf Groß-/Kleinschreibung achten.

Angelegt habe ich die Tabellen mit: CREATE TABLE auto (autokennzeichen character varying (20) NOT NULL, marke character varying (20), CONSTRAINT auto_pkey PRIMARY KEY (autokennzeichen)WITH(OIDS=FALSE); ALTER TABLE auto OWNER TO “Ingrid”; und
CREATE TABLE tanken (ID integer NOT NULL, autokennzeichen character varying (20),
CONSTRAINT tanken_pkey PRIMARY KEY (id), foreign key (autokennzeichen) references auto)WITH (OIDS=FALSE); ALTER TABLE tanken OWNER TO “Ingrid”;
und in Java habe ich versucht die Datensätze mit “SELECT * FROM auto;” oder “INSERT INTO auto VALUES (’” + kennzeichen + “’, '” + marke + “’); \n Commit;” abzufragen bzw. neue Datensätze anzulegen. Wenn ich diese Datensätze direkt bei pgAdmin3 starte, wird eingefügt bzw. abgefragt. Daher vermute ich, dass ich von Java keine Verbindung zu den Tabellen aufgebaut habe.

Es gibt bestimmt Methoden für Transaktionen. Du solltest vermeiden das COMMIT direkt an das INSERT anzuhängen. Andernfalls bekommst du den Rückgabewert vom COMMIT und nicht den vom INSERT. Und der ist eigentlich immer “OK”.

Ach ja, wie war das mit [ code ] Tags? Das erhöht ungemein die Lesbarkeit deines Postings.

Hast Du wirklich das commit und das SELECT in einem Java String?
Das geht nicht.

Statement.execute() (und seine Derivate) könnten nur genau ein Statement ausführen.
Normalerweise kriegst Du eine Exception wenn Du in dem SQL String ein Semikolon drin hast…

Du musst also sowas wie

try
{
   stmt.executeUpdate("INSERT INTO auto VALUES ('" + kennzeichen + "', '" + marke + "');
   con.commit();
}
catch (SQLException sql)
{
   sql.printStackTrace();
   con.rollback();
}

machen

Danke für die Hilfe. Ich habe die Befehle im Java-Programm entsprechend geändert (kein Commit und Semikolon). Trotzdem bekomme ich weiterhin die Fehlermeldung: SQLException: org.postgresql.util.PSQLException: FEHLER: Relation »auto« existiert nicht.
Ich habe bei den Befehlen auto in public.auto geändert, bekomme aber auch eine Fehlermeldung (FEHLER: Relation »public.auto« existiert nicht).
Ich habe die Verbindung zu Postgres nach der Internetseite (http://www.pg-forum.de/h-ufig-gestellte-fragen-faq/1801-startup-f-r-postgresql-jdbc-eclipse.html) programmiert.
Dort bekomme ich keine Fehlermeldungen und die Verbindung wird als org.postgresql.jdbc4.Jdbc4Connection@587c94 ausgegeben.
Ich weiß nicht mehr weiter.

Ich kann hier nur vermuten. Und ich vermute, Du hast da vielleicht Probleme mit groß/KLEIN - ScHrEiBuNg. Was ist denn, wenn Du mit psql Dich auf der DB einloggst und schaust, ob es die Tabelle da gibt?

Andreas

Das dachte ich auch zuerst. Aber wenn das gepostete CREATE TABLE stimmt, kann’s eigentlich nicht sein (weil keine Quotes verwendet)

Ich tippe eher auf eine falsche Verbindung (z.B. falsche DB ausgewählt in der JDBC URL)

Die Tabellen wurden mit PGAdmin angelegt. Falls man da Großbuchstaben eingibt, quotet PGAdmin von sich aus …

Andreas

Danke für den Tip. Das war genau der Fehler. Ich habe als Datenbank postgres angegeben, nicht die eigentliche Datenbank Ingrid_Tankbuch. Jetzt funktioniert es. Danke!!!

Oh mei :wink:

Ich habe eigentlich das gleiche Problem …

Driver O.K !!!
Mai 05, 2017 10:24:52 AM org.postgresql.Driver connect
SCHWERWIEGEND: Connection error:
org.postgresql.util.PSQLException: FATAL: Datenbank »postgres/public.Books« existiert nicht (pgjdbc: autodetected server-encoding to be ISO8859_1, if the message is not readable, please check database logs and/or host, port, dbname, user, password, pg_hba.conf)

Der Code dafür :

public Connect(){
    try {
      Class.forName("org.postgresql.Driver");
      System.out.println("Driver O.K !!! ");

      String url = "jdbc:postgresql://localhost:5432/postgres/public.Books";
      String user = "postgres";
      String passwd = "Ri09422430";

      conn = DriverManager.getConnection(url, user, passwd);
      System.out.println("Connexion effective !");         
         
    } catch (Exception e) {
    }

Wie kann ich das lösen obwohl funktioniert es ganz gut auf PostgreSQL . Aber ich kriege den Fehler im JAVA :frowning:

was sagt denn ein frisch-fröhlicher Aufruf von psql -l, um mal alle bestehenden Datenbanken anzeigen zu lassen?

Vermutlich hast Du eine DB mit Namen postgres. Darin ein Schema public. Und willst auf die Tabelle Books zugreifen? Oder was?

Ich denke mal, Du willst also nur auf die “jdbc:postgresql://localhost:5432/postgres” zugreifen, oder? Das Schema public ist per Default im Search-Path.