DB2-Connect mit Java-Apli.(Windows/Eclipse-Editor)

Hallo zusammen,
ich versuche (immer noch :wink:

einen ersten einfachen Kontakt mit DB2 mit Java (Aplikation) herzustellen.
Alles unter Win2k, falls das eine Rolle spielen sollte.

Unten stehen genau die Schritte die ich gegangen bin, es hackt gerade an „Unhandled exception type SQLException HelloWorld.java“
(siehe ganz unten)

oder auch an der Zeile
Class.forName ( „com.ibm.db2.jcc.DB2Driver“ ) ;
mit der Fehlermeldung:
Unhandled exception type ClassNotFoundException HelloWorld.java.

Ich verstehe nicht was falsch ist, bzw. was ich vesuchen sollte oder in welcher Richtung ich weiter recherchieren könnte.
Vielen dank für Tipps!

Hier nun die ausführliche Version von dem was ich getan habe:

Versuch 1:
Versuche mich mit DB2 über Java zu verbinden.

  1. Starten von Editor Eclipse 3.0.1 für Java.
    D.h. Download, auspacken starten, Instalation nicht nötig.
    Alles ist in einer 85MB großen eclipse-SDK-3.0.1-win32.zip.

  2. Ich erstelle dort eine HelloWorld.java mittels des Eclipse–Tutorials.
    Zu finden im Help – Menü.

  3. Ideen in folien.pdf (hier lokal im gleichen Ordner) finden.

  4. db2cc.jar und db2cc_license_cu.jar
    ins „…/lib/ext“-Verzeichniss von Java kopiert.

jar’s sind komprimierte Dateien. Java-Treiber, Programme, Applets, Handy-spiele… Jars sind manchmal direkt ausführbar (d.h. java dekomprimiert on-the-fly).

  1. Ich füge
    import java.util.* ;
    hinzu.
    Wieder oben auf den gründen Play-Knopf und auswählen
    „Run As->Java Aplikation“.

Gut keine Fehlermeldung.
Nur eine Warnung:
The import java.util is never used HelloWorld.java

Klar das ist ja auch logisch.
6. Jetzt einmal mutiger, d.h. hinzufügen von:

import java.io.* ;
import java.sql.* ;
import java.net.* ;

Prima, wieder keine Fehlermeldung, nur 4mal die bekannte Warnung.
7. Hinzufügen von:
import javax.servlet.* ;
import javax.servlet.http.* ;

Meldung:
The import javax.servlet cannot be resolved HelloWorld.java

Na, das geht also erst mal nicht… nicht so schlimm.
8. Hinzufügen:

// defaultsfor connecting to the database
String group = „23“ ;
String database = „IMDB23“ ;
String userid = „dbpw0323“ ;
String url = „“ ;
String passwd = „“ ;
String request = „“ ;

das ging in der Klassendefinition - also unmittelbar nach:
public class HelloWorld { …
9. Danach in die main Methode eingeügt ohne Fehlermeldung:
Class.forName ( „com.ibm.db2.jcc.DB2Driver“ ) ;

Fehlermeldung:
Unhandled exception type ClassNotFoundException HelloWorld.java.

  1. Was ist denn „COM.ibm.db2.jdbc.app.DB2Driver“ ?
    Ist ein Standart-klassenname unter java, so wie z.B.:
    java.io.DataInputStream oder java.lang.System oder javax.swing.JFrame.

Ist nicht Linux/Unix spezifisch, nein, java-spezifisch.
(Der angesprochene Treiber kann aber Platform-spezifisch sein, das weiss man nicht)

  1. Am Rande gesagt:
    Ist die COM.ibm.db2.jdbc.app.DB2Driver jar ist nicht installiert?
    Vielleicht kann ich irgendwo eine Datei finden die „DB2Driver“ enthällt. Muss ich vielleicht den Pfad anpassen?
    Vielleicht ist ja COM.ibm.db2.jdbc.app. ein Pfad zu dieser Datei?

So eine Datei konnte ich nirgendwo gefunden.

  1. Versuch mit
    db = DriverManager.getConnection(url, userid, passwd);
    db ist ein Datentyp Connection alle anderen sind String. Alles muss am Anfang der Klasse definiert sein als static.

Beispiel:

static String request = „“ ;
static Connection db ;
13. Meldung:
14. Unhandled exception type SQLException HelloWorld.java HelloWorldProject line 46 25. Januar 2005 19:40:56

Was hat das zu bedeuten ?

  1. Danach in die main Methode eingeügt ohne Fehlermeldung:
    Class.forName ( „com.ibm.db2.jcc.DB2Driver“ ) ;
    Fehlermeldung: Unhandled exception type ClassNotFoundException HelloWorld.java.

Ist das jetzt geloest. Werde nicht so ganz schlau aus deiner Aufteilung.

  1. Versuch mit
  2. Unhandled exception type
    SQLException HelloWorld.java HelloWorldProject line 46 25.
    Januar 2005 19:40:56

Was hat das zu bedeuten ?

Was passiert denn in Zeile 46?? Mehr Code waere hilfreich.

Hi Patrick :smile:
schönen dank erst mal :smile:

  1. Danach in die main Methode eingeügt ohne Fehlermeldung:
    Class.forName ( „com.ibm.db2.jcc.DB2Driver“ ) ;
    Fehlermeldung: Unhandled exception type ClassNotFoundException HelloWorld.java.

Ist das jetzt geloest.

Nein ist nicht gelöst, ich habe nur einfach danach versucht einen anderen Weg einzuschlagen.

Ich habe nur (mit Punkt 12.) versucht auf eine andere Art weiterzumachen und zwar mit
db = DriverManager.getConnection(url, userid, passwd);
Ich weiss nicht was das
Class.forName ( „com.ibm.db2.jcc.DB2Driver“ ) ;
macht und hab mir gedacht, vielleicht brauche ich das ja gar nicht.
Daher der Versuch einfach ohne das.

  1. Versuch mit db = DriverManager.getConnection(url, userid, passwd);
    Unhandled exception type
    SQLException HelloWorld.java HelloWorldProject line 46 25.
    Januar 2005 19:40:56

Was hat das zu bedeuten ?

Was passiert denn in Zeile 46?? Mehr Code waere hilfreich.

Hier die komplette derzeitige HelloWorld.java

import java.util.\* ;
import java.io.\* ;
import java.sql.\* ;
import java.net.\* ;
public class HelloWorld {
 // defaults for connecting to the database
 static String group = "23" ;
 static String database = "IMDB23" ;
 static String userid = "dbpw0323" ;
 static String url = "" ;
 static String passwd = "" ;
 static String request = "" ;
 static Connection db ;
 public static void main(String[] args) {
 // Warum kommt hier:
 // Unhandled exception type SQLException
 db = DriverManager.getConnection(url, userid, passwd);
 System.out.println("Hello world!");
 }
}

mit Class.forName() kannst du eine class Datei nachträglich laden. Das brauchst du hierbei, damit sich der db treiber registrieren kann.
da du eine ClassNotFoundException bekommst, vermute ich mal, dass java die Datei nicht finden kann.
versuch mal java so aufzurufen:
java -cp db2.jar HelloWorld

Ich weiss nicht was das
Class.forName ( „com.ibm.db2.jcc.DB2Driver“ ) ;
macht und hab mir gedacht, vielleicht brauche ich das ja gar
nicht.

Doch brauchst du. Das ist der Treiber der da geladen wird.

Hier die komplette derzeitige HelloWorld.java

 // Warum kommt hier:
 // Unhandled exception type SQLException
 db = DriverManager.getConnection(url, userid, passwd);

Weil der Treiber nicht geladen ist. Du rufst quasi irgendwo an,
hast aber die Nummer nicht gewaehlt. :wink:

Dein Beispiel muesste in etwa so aussehen.

 static Connection db ;
 public static void main(String[] args) {
 try {
 Class.forName ( "com.ibm.db2.jcc.DB2Driver" ) ;
 db = DriverManager.getConnection(url, userid, passwd);
 System.out.println("Hello world!");
 } catch (Exception e) {
 e.printStackTrace();
 } finally {
 if (db != null) {
 try {
 db.close();
 } catch (SQLException e1) {
 e1.printStackTrace();
 }
 }
 }
 } // main()

Achte darauf, dass die JAR-Dateien (oder ZIP) in deinem
Projekt-Pfad sind, damit eclipse weiss was du willst.
(Rechtsklick auf dein Project -> Properties ->
Java Build Path -> Libraries -> Add External JARs)

Fuer DB2 7.1 muessen da z.B. db2java.zip und runtime.zip
eingebunden sein.

Gruss, Patrick

Hi,

ich versuche, nochmal, die Vorgänge zusammenzufassen:
Gehe in Eclipse im Menü „Fenster/Benutzervorgaben“. Dort findest Du links „Java/Erstellungspfad/Klassenpfadvariablen“. Dann legst Du eine neue an: als Name wählst Du z.B. „DB2_DRIVER_PATH“ und suchst dann nach der db2java.zip (liegt vermutlich im Verzeichnis „c:\Programme\IBM\SQLLIB\java“.

Dann öffnest Du die Eigenschaften Deines Projekts in Eclipse (Rechtsklick im Projekt-Explorer). Dort fügst Du bei den Bibliotheken dann die eben erstellte Variable „DB2_DRIVER_PATH“ zu.

Jetzt sollten alle benötigten DB2-Klassen bekannt sein und ein Programm könnte nun (wie weiter unten schon gepostet so aussehen:

import java.sql.Connection;
import java.sql.DriverManager;

public class Sample {

 public static void main(String[] args) {

 final String url = "jdbc:db2:smiley:ATENBANK";
 final String user = "mustermann";
 final String pass = "musterpass";

 Connection conn = null;

 try {
 Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
 conn = DriverManager.getConnection(url, user, pass);
 // ... hier geht's weiter ...
 }
 catch (Throwable thr) {
 thr.printStackTrace();
 }
 finally {
 try {
 conn.close();
 }
 catch (Throwable thr2) {}
 }

 }
}

Viele Grüße
Lars

P.S. Du solltest den DB2Driver aus dem Paket „COM.ibm.db2.jdbc.app“ benuten !
P.SS. beachte die korrekte URL zur Datenbank

Feedback
Hi Lars und andere, erst mal wieder danke.
habe gerade die Language-Packs downloadet und in die entsprechenden Verzeichnisse kopiert.
=> Mein Eclipse jetzt auch auf Deutsch.

Gehe in Eclipse im Menü „Fenster/Benutzervorgaben“.

Gibts jetzt :smile:

findest Du links „Java/Erstellungspfad/Klassenpfadvariablen“.

Ja heißt bei mir (trotz Language-Pack)
„Java/BuiltPath/ClasspathVariables/“

Dann legst Du eine neue an: als Name wählst Du z.B.
„DB2_DRIVER_PATH“ und suchst dann nach der db2java.zip (liegt
vermutlich im Verzeichnis „c:\Programme\IBM\SQLLIB\java“.

Ok das hat gut geklappt:
DB2_DRIVER_PATH C:/Programme/_IBM/SQLLIB/java/db2java.zip

Dann öffnest Du die Eigenschaften Deines Projekts in Eclipse
(Rechtsklick im Projekt-Explorer). Dort fügst Du bei den
Bibliotheken dann die eben erstellte Variable
„DB2_DRIVER_PATH“ zu.

Ging nicht mit Rechtsklick, egal wo, aber es gibt ja ein Manü das, heißt Projekt und da gabs dann Eigenschaften.
Hab dort bei BuiltPath unter Registerkarte Bibliotheken die Varialbe auswählen können.

Hat jetzt besser geklappt, Meldung war nun:

Activation.main: Achtung: Systemeigenschaft sun.rmi.activation.execPolicy
nicht angegeben, und keine ExecPermissions/ExecOptionPermissions
gewährt; erneute Aktivierung kann wegen erfolgloser
Berechtigungsprüfungen ExecPermission/ExecOptionPermission fehlschlagen. Weitere
Dokumentation über die Konfiguration von rmid-Sicherheit finden Sie unter:

http://java.sun.com/j2se/1.4/docs/tooldocs/solaris/r…
http://java.sun.com/j2se/1.4/docs/tooldocs/win32/rmi…

Danach habe ich die Zugangsdaten angepasst und bekahm eine noch umfangreichere Fehlermeldung, aber zumindest, scheint was passiert zu sein:

Activation.main: Achtung: Systemeigenschaft sun.rmi.activation.execPolicy
nicht angegeben, und keine ExecPermissions/ExecOptionPermissions
gewährt; erneute Aktivierung kann wegen erfolgloser
Berechtigungsprüfungen ExecPermission/ExecOptionPermission fehlschlagen. Weitere
Dokumentation über die Konfiguration von rmid-Sicherheit finden Sie unter:

http://java.sun.com/j2se/1.4/docs/tooldocs/solaris/r…
http://java.sun.com/j2se/1.4/docs/tooldocs/win32/rmi…

Activation.main: Es ist eine Ausnahme aufgetreten: Port already in use: 1098; nested exception is:
java.net.BindException: Address already in use: JVM_Bind
java.rmi.server.ExportException: Port already in use: 1098; nested exception is:
java.net.BindException: Address already in use: JVM_Bind
at sun.rmi.transport.tcp.TCPTransport.listen(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.exportObject(Unknown Source)
at sun.rmi.transport.tcp.TCPEndpoint.exportObject(Unknown Source)
at sun.rmi.transport.LiveRef.exportObject(Unknown Source)
at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source)
at sun.rmi.registry.RegistryImpl.setup(Unknown Source)
at sun.rmi.registry.RegistryImpl.(Unknown Source)
at java.rmi.registry.LocateRegistry.createRegistry(Unknown Source)
at sun.rmi.server.Activation.main(Unknown Source)
Caused by: java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.(Unknown Source)
at java.net.ServerSocket.(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createServerSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createServerSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(Unknown Source)
… 9 more

P.S. Du solltest den DB2Driver aus dem Paket
„COM.ibm.db2.jdbc.app“ benuten !

Werds noch nachprüfen.

P.SS. beachte die korrekte URL zur Datenbank

Tja, danke… stehe da aber leider etwas auf dem Schlauch, wo ich die wohl finden könnte.

Jedenfall danke … wieder was gelernt.
Vielleicht klappts ja bald… hmmm.

Gruß Sebasitan

Feedback 2
Hi ich hatte einen Fehler gemacht, nämlich den das Projekt zu starten als Aplikation, jetzt wo ich nur die Klasse (rechtsklick) ausgeführt habe ist mir die Ausgabe schon vertrauter:

Hello world 1 !
java.sql.SQLException: No suitable driver
 at java.sql.DriverManager.getConnection(Unknown Source)
 at java.sql.DriverManager.getConnection(Unknown Source)
 at HelloWorld.main(HelloWorld.java:35)
Hello world 2 !

Heist das ich habe die falschen Zugangsdaten verwendet?

Unten noch schnell den Code dazu, sicher ist sicher…

/\*
// defaults for connecting to the database
static String group = "23" ;
static String database = "IMDB23" ;
static String userid = "dbpw0323" ;
static String url = "" ;
static String passwd = "" ;
static String request = "" ;
static Connection db ;

\*/

import java.util.\* ;
import java.io.\* ;
import java.sql.\* ;
import java.net.\* ;

import java.sql.Connection;
import java.sql.DriverManager;

public class HelloWorld {

public static void main(String[] args) {

 System.out.println("Hello world 1 !");

 final String url = "daten\_BEEP";
 final String user = "user\_\_BEEP";
 final String pass = "pass\_\_BEEP";

 Connection conn = null;

 try {
 Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
 conn = DriverManager.getConnection(url, user, pass);
 // ... hier geht's weiter ...
 }
 catch (Throwable thr) {
 thr.printStackTrace();
 }
 finally {
 try {
 conn.close();
 }
 catch (Throwable thr2) {}
 }

 System.out.println("Hello world 2 !");

}
}

Hallom

Hi ich hatte einen Fehler gemacht, nämlich den das Projekt zu
starten als Aplikation, jetzt wo ich nur die Klasse
(rechtsklick) ausgeführt habe ist mir die Ausgabe schon
vertrauter:

Hello world 1 !
java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at HelloWorld.main(HelloWorld.java:35)
Hello world 2 !

Heist das ich habe die falschen Zugangsdaten verwendet?

Sieht eher so aus, als würdest du den falschen Treiber verwenden. Welche Datenbank genau verwendest du denn? DB2, Cloudscape?

Gruss,
Andreas

java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at HelloWorld.main(HelloWorld.java:35)
Hello world 2 !

Sieht so aus, als ob die url falsch ist. Die muss etwa so aussehen:
jdbc:db2:smiley:ATABASE_ALIAS

DATABASE_ALIAS findest du z.B. unter
IBM DB2 -> Client Configuration Assistant
Da werden alle Datenbanken aufgelistet mit ihrem entsprechenden Alias.

...
 final String url = "jdbc:db2:NAMEMEINERDB";
...

Gruss, Patrick

JAAA !!! :smile:)) Das wars !! die Url und die Zugangsd
daten musste ich noch anpassen !! :smile:)
Cool !!
Denke jetzt sollte es einfach werden…
Ihr seite zwei Schatz :wink:
Und an alle danke die sich nen Kopf gemacht haben.

Bis denne.

Wünsch euch was… jetzt klopft Euch mal auf die Schulter…
habt Ihr mal wieder jemanden so richtig geholfen :smile:

Tschü
Sebastian