Probleme mit Oracle Treiber...

airliner

Erfahrenes Mitglied
Hi Leute!

Ich bin erst seit ca. zwei Wochen dabei mir java anzueignen und bin dementsprechend recht unerfahren.
Beim Praktikum hab ich dann die Aufgabe bekommen eine Applikation unter java zu schreiben, womit man auf unsere Test-DB (Oracle Express XE) zugreifen kann (noch nichts mit GUI oder ähnliches, erstmal nur verbindung herstellen).

Hab auch schon bei :google: nachgeforscht und mich informiert, aber so recht will's nich klappen.

Laut Eclipse (glaub 3.3 is derzeit auf'm rechner) liegen auch keine Syntax-Fehler vor.
Den Oracle-Treiber habe ich vie File->Import reingeholt. oder liegt da schon mein Fehler?

Code:
import java.sql.*; 
import oracle.jdbc.driver.*;

class einwahlauslese{

public static void main(String[]arguments) {
	Connection con = null;
	Statement stmt;
	ResultSet result;
try {
	Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch (Exception e) {
	System.out.println("Treiber konnte nicht gefunden werden "+e);
}

try{
	String db_Url = "jdbc:oracle:thin:@kmmaster-ts:1521:XE";
	String db_UserName = "xxxx";
	String db_UserPw = "zzzz";
		
Connection my_con = DriverManager.getConnection(db_Url, db_UserName, db_UserPw);

}
catch (Exception e) {System.out.println("Keine Verbindung "+e);
}
try{
	stmt=con.createStatement();
	String sqlQuery = "SELECT * FROM Systemuser WHERE Nachname LIKE 'A%'";
	result = stmt.executeQuery(sqlQuery);
	while(result.next()){
		System.out.println(result.getString(3)+"\n" + result.getString(10));}
} catch (Exception e){
	System.out.println("Fehler bei Abfrage "+e);
}
try{
	DatabaseMetaData meta = con.getMetaData();
	System.out.println("Datenbank: "+meta.getDatabaseProductName());
	System.out.println("Datenbankversion: "+meta.getDatabaseProductVersion());
}catch(Exception e){
	System.out.println("Fehler bei MetaDaten-Abfrage "+e);
}
if(con!=null){
	try{
		con.close();
	}catch(Exception e){
		System.out.println("Verbindung kann nicht getrennt werden "+e);
	}
	}
else{
	System.out.println("Verbindung bereits getrennt");
}
}
}

Zugegeben, der Code sieht ziemlich wüst aus, aber was will man nach zwei Wochen erwarten?

Fehlermeldung sieht wie folgt aus:

Treiber konnte nicht gefunden werden java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
Keine Verbindung java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@kmmaster-ts:1521:XE
Fehler bei Abfrage java.lang.NullPointerException
Fehler bei MetaDaten-Abfrage java.lang.NullPointerException
Verbindung bereits getrennt

Würde mich über dienliche Hinweise mehr als freuen!
 
Zuletzt bearbeitet:
Moin,

Du musst den Oracle-Treiber dem Build Path Deines Projektes hinzufügen.

Dazu:
Rechtsklick auf Dein Projekt -> Build Path -> Config -> ...

Und dort gibst Du dann bei Libraries die jar-Datei des Treibers an.

Gruß,
Xan
 
Zuletzt bearbeitet:
Danke schön!

Das Problem hätte sich damit geklärt.
Bleibt allerdings leider noch eine Sache:
Fehler bei Abfrage java.lang.NullPointerException
Verbindung bereits getrennt

Die Metadaten-Abfrage habe ich rausgenommen, wollt nur mal gucken, ob und wie das funktionieren könnte, aber das stell ich erstmal hinten an...
 
Ich seh zwar jetzt auf Anhieb den Fehler auch nicht, aber ein paar Anmerkungen:

* mach nicht mehere try catch Blöcke. Einer reicht, da du ja eh nicht weitermachen kannst wenn schon beim Aufmachen der Verbindung ein Fehler kam.
* im catch gib den stacktrace aus (e.printStackTrace(), dann siehst Du wo die Exception kam
* Benenn Deine Klasse um. Java Klassen beginnen laut Konvention mit einem großen Anfangsbuchstaben. Besser gleich dran gewöhnen.
* Mach Deine Resourcen im finally wieder zu.

Shematisch sieht das bei mir immer so aus:

Java:
Connection con;
Statement st;
ResultSet rs;
try{
   con = ...
   //mach was mit den Objekten
} catch(Exception e) {
   e.printStackTrace();
}
 finally{
  if(null != rs) {
      try{rs.close();} catch(Exception ex) {}
   }
   if(null != st) {
      try{st.close();} catch(Exception ex) {}
   }
   if(null != con) {
      try{con.close();} catch(Exception ex) {}
   }
Man sich jetzt sicherlich streiten ob es nicht reicht nur die connection zu schließen und ob die leeren catch Blöcke beim Schließen gut sind, aber ich denk Du siehts die Idee.
Bau das bitte mal um und post hier den Stacktrace.

Gruß
 
Hab das mal versucht einzubauen (ich weiß, lang ist's her, dass ich mich melde, aber hatte langes Wochenende mit meiner Freundin) und es tritt ein neues Problem auf (Werd ich es hemals hinbekommen? :confused:)

Code:
public static void main(String[] args) {
    new Datenbank_auslesen("Oracle-Test-Datenbank-Zugriff");
    Connection con = null;
        Statement stmt;
        ResultSet result;
        String db_Url = "jdbc:oracle:thin:@kmmaster-ts:1521:XE";
        String db_UserName = "xxxx";
        String db_UserPw = "zzzz";
        
        
        
    try {
          Class.forName("oracle.jdbc.driver.OracleDriver");
          }catch (Exception e) {
                System.out.println("Treiber konnte nicht gefunden werden "+e);
                }
     try{
         con = DriverManager.getConnection(db_Url, db_UserName, db_UserPw);
      }catch(Exception e) {
       e.printStackTrace();
      }
      finally{

          if(null != rs) {
              try{rs.close();} catch(Exception ex) {}
           }

           if(null != st) {
              try{st.close();} catch(Exception ex) {}
           }

           if(null != con) {
              try{con.close();} catch(Exception ex) {}
           }

Mit der Fehlermeldung:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
rs cannot be resolved
rs cannot be resolved
st cannot be resolved
st cannot be resolved

at Datenbank_auslesen.main(Datenbank_auslesen.java:235)

Kann sein, dass die Anzahl an Klammern jetzt nicht ganz hinkommt in dem Code-Schnippsel, aber Eclipse zeigt mir keine Konflikte diesbezüglich an.
 
Hallo airliner,

den genauen Grund für Deine Meldung kann ich Dir auch nicht genau sagen - hatte ich noch nie :-)

Aber in Deinem Codeschnipsel fehlt zumindest die schließende Klammer zu finally!
Du kannst das auch prüfen, indem Du den Cursor HINTER eine öffnende oder schließende Klammer stellt und dann einen Doppelklick machst. Nun wird der gesamte zugehörige Bereich bis zur korrespondierenden Klammer blau hinterlegt - und man sieht, ob es denn die Richtige ist! Die korrespondierende Klammer ist auch vorher schon mit einem leichten Rahmen umgeben, der allerdings (vor allem bei größeren Codebereichen) kaum auffällt!
Es gibt auch eine äquivalente Tastenkombination anstelle des Doppelklicks, aber die fällt mir im Moment nicht ein ..... :confused:

Gruß
Klaus
 
Ich kann dir gerne den gesamten Quellcode hier reinhängen und du darfst dann Klammern zählen :-)

Aber keine Angst, die Klammeranzahl is schon in Ordnung, wie gesagt, Eclipse nörgelt ja nicht rum, was das angeht (die Klammer, die du meinst hatte ich nur nicht markiert und hier mit eingefügt).

Was mich mitlerweile aber immer mehr wurmt ist die Tatsache, dass ich andere, mit gesteckte Ziele nicht gebacken bekomme.
Die GUI enthält zwei jButton (einen zum verbinden/Trennen der verbindung und einen zum Befehle ausführen), eine jComboBox mit der Tabellenübersicht, die es in der DB gibt, ein TextField zum SQL-befehle eingeben (daher der Ausführen jButton) und eine TextArea um das ergebnis der SQL-Befehle und eventl Fehlermeldungen auszugeben.

Am Code zum Verbinden ist soweit alles in Ordnung (hatte ich schon ohne Button getestet), nur jetzt stellt sich einem Laien wie mir die Frage, wie krieg ich meine kleine Applikation dazu auf Knopfdruck die verbindung zur DB herzustellen bzw abzubrechen, die ausgewählte Tabelle aus der jComboBox in das textField zu bringen und Ergebnis bzw fehlermeldungen in die TextArea auf Knopfdruck zu bringen?

Sollte doch an sich nicht so schwierig werden oder?

Wenn ihr Vorschläge habt, dann postet sie bitte mit Beispielcode, damit ich mir darunter etwas vorstellen kann. Denn bei soziemlich allen :google:ergebnissen kommen zwar nette Tips und Tricks, aber ich kann damit nichts anfangen...
 
Ich kann dir gerne den gesamten Quellcode hier reinhängen und du darfst dann Klammern zählen :-)
Ach nö, lieber nicht ... :-)

Hätte vielleicht auch lieber genauer lesen sollen (hatte mich nur auf Deinen letzten Satz bezogen) ... Die Fehlermeldung besagt ja, dass rs und st als Symbol nicht aufgelöst werden können, was daran liegt, dass sie in Deiner Main-Funktion nicht deklariert werden !!

Zu dem DB-Problem kann ich nicht wirklich was sagen, da ich hier von meinen Java-Clients aus keine derartigen Verbindungen aufbaue - wir gehen immer über einen C++-Server ...

Gruß
Klaus
 
Boa, ich krieg hier gleich 'n kleinen raster...:mad:

Hatte den Fehler gefunden...

rs und st sind in der main initialisiert gewesen, nur unter anderem namen :-)
Das drollige ist jetzt aber: laut Eclipse würde eine Klammer fehlen und den ClassBody zu schließen. Setze ich diese Klammer sind rs (nun result) und st (nun stmt) nicht mehr initialisiert :confused:

Wenn das so weiter geht wachsen mir noch graue Haare wegen sowas!

Zu dem DB-Problem kann ich nicht wirklich was sagen, da ich hier von meinen Java-Clients aus keine derartigen Verbindungen aufbaue - wir gehen immer über einen C++-Server ...

Die Verbindung an sich ist ja auch kein Problem, das haut auch hin.
Es geht mir jetzt einzig um die Reaktionen der Applikation auf die unten genannten Szenarien.
 
Moin,

pack mal bitte den kompletten Code der Klasse rein, so hat man leider nur eine Vorahnung,
kann aber nichts konkretes aufzeigen.

Gruß,
Xan
 
Zurück