PDA

View Full Version : Datenbank Verbindung auf die AS400?



Seiten : [1] 2 3

SourceCoder
04-02-14, 12:14
Schönen guten Tag zusammen,

ich habe mal hier ein Script welches auf die Datenbank zugreifen soll, hab es erfolgreich mit QSH gewandelt doch beim ausführen bekomme ich diese Fehlermeldung, leider weiß ich nicht genau das diese bedeutet und wie ich Sie beheben kann und hoffe auf Ihre Hilfe.

Infos:

Fehlermeldung:

java.lang.ClassNotFoundException: COM.ibm.db2.jdbc.app.DB2Driver
at java.lang.Class.forName(Class.java:130)
at DBverbindung.main(DBverbindung.java:13)
java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getConnection(DriverManager .java:592)
at java.sql.DriverManager.getConnection(DriverManager .java:196)
at DBverbindung.main(DBverbindung.java:21)
Exception in thread "main" java.lang.NullPointerException
at DBverbindung.main(DBverbindung.java:31)

CLASSPATH:

Neuer Wert . . . . . . . . . . . '''.:/QIBM/ProdData/Java400/ext/db2_classes.
jar:/QIBM/ProdData/OS400/jt400/lib/jt400Native.jar:/QIBM/ProdData/Java400/jdk6/b
in:/QIBM/ProdData/HTTP/Public/jt400/lib/jt400.jar'

Call:

java -classpath "/X/Y/C/src/" DBverbindung



Code:



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class HauptKlasse
{
public static void main(String[] args)
{
// load the DB2 Driver
try {
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

// establish a connection to DB2
try {
Connection db2Conn = DriverManager.getConnection("jdbc:db2:Datenbank","USER","USER");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Connection db2Conn = null;
Statement st = null;

try {
st = db2Conn.createStatement();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String myQuery = "SELECT * FROM Bibo.Tabelle;

// execute the query
ResultSet resultSet = null;

try {
resultSet = st.executeQuery(myQuery);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

// cycle through the resulSet and display what was grabbed

try {
while (resultSet.next())
{
String name = resultSet.getString("Marke");
String phoneNumber = resultSet.getString("Anzahl");
System.out.println("Name: " + name);
System.out.println("Phone Number: " + phoneNumber);
System.out.println("-------------------------------");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

// clean up resources
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
db2Conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


Die Toolbox mit der JDBC ist vonhanden.
Hinweis:
/QIBM/ProdData/HTTP/Public/jt400/lib/jt400.jar
/QIBM/ProdData/OS400/jt400/lib/jt400Native.jar

Beide Datei sind da.

Fuerchau
04-02-14, 14:04
Der Treiber-Name ist Casesensitive.
Die Schreibweise ist also GENAU einzuhalten, damit der Treiber gefunden wird.
Beispiel der Toolbox-Treiber:
com.ibm.as400.access.AS400JDBCDriver

Connectionstring:
jdbc:as400://DB-Name/DefaultLib

Der DB-Name muss per WRKRDBDIRE registriert sein.

SourceCoder
04-02-14, 14:49
Danke für den Tipp. Hab nun bekomme ich diesen Fehler:



java.sql.SQLException: INTERNAL ERROR: Creation of DB2Driver object for registering with DriverManager failed. -> com.ibm.db2.jd
bc.app.DB2JDBCDataException: CCSID value is not valid.


Hab auch schon per chgjob CCSID auf 37 gesetzt hat nichts gebracht.

Und gibt es ein gutes Beispiel wie man eine Verbindung zur DB aufbau die den Treiber verwendet den Sie genannt haben? (com.ibm.as400.access.AS400JDBCDriver)

Fuerchau
04-02-14, 14:58
Mit obigem Namen geht das bei mir so:

Class.forName(driverName); // register driver
con = DriverManager.getConnection(url, userName, password);
fromSelect = con.createStatement();
fromSelect.setQueryTimeout(60);
fromResult = fromSelect.executeQuery("select * from ...");
while(fromResult.next()) {
// mach was
}

SourceCoder
04-02-14, 15:21
Ich habe mich mal ein Ihre Vorlage gehalten, wie es aussieht findet der den Treiber nicht obwohl ich in der CLASSPATH den angegeben habe.

Mein Code:


public static void main(java.lang.String[] args) {




try {
Class.forName("com.ibm.as400.access.AS400JDBCDriver");
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
System.out.println("ERROR: One of the JDBC drivers did not load.");
System.exit(0);
}


try
{
// Obtain a connection with each driver.
Connection conn1 = DriverManager.getConnection("Jdbc:as400://DB", "X","X");

Statement stmt = conn1.createStatement();
stmt.setQueryTimeout(60);
ResultSet rs = stmt.executeQuery("select * from babachanja.BLEISTIFT");

while(rs.next()) {
System.out.println(rs.getString("Marke"));
}

conn1.close();
}
catch (SQLException e)
{
System.out.println("ERROR: " + e.getMessage());
}
}

Fehler: ERROR: One of the JDBC drivers did not load.

CLASSHPATH:

Umgebungsvariable . . . . . . . > 'CLASSPATH' Zeichenwert
Neuer Wert . . . . . . . . . . . '.:QIBM/ProdData/Java400/ext/db2_classes.jar
/QIBM/ProdData/OS400/jt400/lib/jt400Native.jar:/QIBM/ProdData/HTTP/Public/jt400
lib/jt400.jar:/QIBM/ProdData/Java400/jdk6/bin'

Call:



java -classpath "/X/Y/C/src" HalloWelt

Fuerchau
04-02-14, 17:07
Wenn du beim Aufruf -classpath angibst, wird die Umgebungsvariable CLASSPATH nicht verwendet!
Du kannst aber
-classpath $CLASSTPTH:/X/Y/C/src HalloWelt
verwenden.
$Variable wird dann extrahiert.

SourceCoder
05-02-14, 07:20
Bis ich das zum laufen bekomme, werde ich alt und grau xD.

Code steht im letzten Beitrag.



java -classpath $CLASSPATH: "/X/Y/C/src" HalloWelt
Exception in thread "main" java.lang.NoClassDefFoundError: .X.Y.C.src
Caused by: java.lang.ClassNotFoundException: .X.Y.C.src
at java.net.URLClassLoader.findClass(URLClassLoader.j ava:498)
at java.lang.ClassLoader.loadClass(ClassLoader.java:6 50)
at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:6 16)

BenderD
05-02-14, 07:38
... das mit dem alt und grau, das kann ich nachvollziehen, deine Lernversuche erinnern mich an ein Krabbelkind, dem man Fahrrad fahren beibringen will...

Fang doch mal mit dem Basiswissen an:
https://www.dropbox.com/l/7tfWJqi3BRJJSFplOXmNea

wenn Du da durch bist und auf Datenbanken los willst, dann vielleicht hier weiter:
http://docs.oracle.com/javase/tutorial/jdbc/

Für die AS/400 Spezifika gibt es wenig taugliches Material, überall wo IBM draufsteht, findest Du da nur *** ( so Beispiele wie das, welches Du als Ausgangspunkt genommen hast). Aber für den Anfang bist Du ja erst mal versorgt.

D*B

Fuerchau
05-02-14, 08:22
java -classpath $CLASSPATH:/X/Y/C/src HalloWelt

Zwischen $CLASSPATH und deinem Path ist das Leerzeichen zu viel und der Pfad gehört nur in Anführungstriche bei Leerzeichen, es geht also auch:
java -classpath $CLASSPATH:"/X/Y/C/src" HalloWelt

SourceCoder
05-02-14, 08:32
BenderD (http://newsolutions.de/forum-systemi-as400-i5-iseries/members/875-BenderD) danke für die Links.

Zur meiner Verteidigung, ich habe kein Problem mit Java welches ist aktiv in der Schule lerne.
Mein Problem ist es, das wir nur mit Eclipse entwickeln und ich mich mit dieser QSH Konsole überhaupt nicht auskenne und meine AS400 Kenntnisse sind noch auf einem sehr niedrigen Level.

Aber jeder hat mal klein Angefangen, und ich hoffe das ich in einigen Jahren, hier nicht nur Fragen stelle , sondern auch helfe beantworten kann.



Für die AS/400 Spezifika gibt es wenig taugliches Material, überall wo IBM draufsteht, findest Du da nur *** ( so Beispiele wie das, welches Du als Ausgangspunkt genommen hast).


Kann ich nur bestätigen, ich hatte mal ein Codebeispiel für C++ übernommen der hälfte des Code war falsch und bis ich verstanden habe das auch IBM was falsch machen kann waren Tage vergangen.

Fuerchau (http://newsolutions.de/forum-systemi-as400-i5-iseries/members/160-Fuerchau): Ich danke Ihnen für die Hilfe, so hat es funktioniert.


Hatte in der zwischen Zeit was anderes versucht doch auch ohne erfolg.



===> export -s CLASSPATH=/QIBM/ProdData/HTTP/Public/jt400/lib/jt400.jar:QIBM/ProdData/Java400/ext/db2_classes.jar:/QIBM/ProdData/OS
400/jt400/lib/jt400Native.jar:/QIBM/ProdData/Java400/jdk6/bin


und dann java "/X/Y/C/src" HalloWelt

weil das hier geholfen haben soll --> http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/9841-Erste-Schritte-mit-Java-gt-package-com-ibm-as400-access-does-not-exist

Aber war wohl nicht so xD.