PDA

View Full Version : javaprogramm



mk
17-01-05, 16:12
Hallo Java Fraktion,

ich versuche gerade ein bischen mit Java zu machen. Folgendes Problem:
Die Coonection klappt. Der SQL string klappt auch.
Ich bekomme aber keine Daten in das Result set.
Hat jemand eine Idee ?
Oder vielleicht ein Rumpf wie man solche Abfragen mit Java
erledigen kann.

Vielen Dank
Michael


Connection connection;
try {
connection = DriverManager.getConnection("jdbc:as400://as400", "user", "passw" );
Statement statement = connection.createStatement() ;
ResultSet resultSet = statement.executeQuery("select * from MK.STMASTTEST " );
// "where ststyl like 'A%%%%%' " );
int x = resultSet.getRow();
if (x != 0){
String ersteSpalte = resultSet.getString(0);
}

BenderD
17-01-05, 16:21
Hallo Michael,

du solltest da einen SQL Fehler bekommen (cursor state not valid) dir fehlt der Aufruf von next() des ResultSet. Ein Beispiel dazu findest du eigentlich in jedem Tutorial (Mr. Google ist dein Freund) und selbstredend auf meiner Open Source Seite.
Ansonsten könnte es freilich nicht schaden in try catch Blöcken zumindest mal eine Diagnostic Ausgabe zu machen, damit du sofort siehst was krumm ist.

mfg

Dieter Bender



Hallo Java Fraktion,

ich versuche gerade ein bischen mit Java zu machen. Folgendes Problem:
Die Coonection klappt. Der SQL string klappt auch.
Ich bekomme aber keine Daten in das Result set.
Hat jemand eine Idee ?
Oder vielleicht ein Rumpf wie man solche Abfragen mit Java
erledigen kann.

Vielen Dank
Michael


Connection connection;
try {
connection = DriverManager.getConnection("jdbc:as400://as400", "user", "passw" );
Statement statement = connection.createStatement() ;
ResultSet resultSet = statement.executeQuery("select * from MK.STMASTTEST " );
// "where ststyl like 'A%%%%%' " );
int x = resultSet.getRow();
if (x != 0){
String ersteSpalte = resultSet.getString(0);
}

mk
17-01-05, 16:36
Hallo Dieter,

das ist es ja. wenn ich den if (x != 0) rausnehme bekomme ich den u.a Fehler.

Ich habe aber im Debugger an der Sql stelle angehalten und
in dem QZDAINIT Job gesehen das das SQL Statement
auf die Lib MK und auf die Datei STMASTTEST geht.
Ich habe auch 15000 Sätze in die Datei kopiert.

Irgendwie will es noch nicht klappen.

Gruss Michael



java.sql.SQLException: Cursor position not valid.
at com.ibm.as400.access.JDError.throwSQLException(JDE rror.java:382)
at com.ibm.as400.access.JDError.throwSQLException(JDE rror.java:359)
at com.ibm.as400.access.AS400JDBCResultSet.getValue(A S400JDBCResultSet.java:3589)
at com.ibm.as400.access.AS400JDBCResultSet.getString( AS400JDBCResultSet.java:3230)
at de.asmika.controler.GetActiveCostingCountry.SqlSta ement(GetActiveCostingCountry.java:101)
at de.asmika.controler.StartProgramm.main(StartProgra mm.java:33)

BenderD
17-01-05, 17:00
Hallo,

warum glaubt mir denn keiner?
ResultSet resultSet = statement.executeQuery("select * from MK.STMASTTEST " );
// das war der open auf den Cursor
// und jetzt muss erst gelesen werden:
resultSet.next();
// und jetzt darfst du weiter machen
String ersteSpalte = resultSet.getString(1);

mfg

Dieter Bender // "where ststyl like 'A%%%%%' " );



Hallo Java Fraktion,

ich versuche gerade ein bischen mit Java zu machen. Folgendes Problem:
Die Coonection klappt. Der SQL string klappt auch.
Ich bekomme aber keine Daten in das Result set.
Hat jemand eine Idee ?
Oder vielleicht ein Rumpf wie man solche Abfragen mit Java
erledigen kann.

Vielen Dank
Michael


Connection connection;
try {
connection = DriverManager.getConnection("jdbc:as400://as400", "user", "passw" );
Statement statement = connection.createStatement() ;
ResultSet resultSet = statement.executeQuery("select * from MK.STMASTTEST " );
// "where ststyl like 'A%%%%%' " );
int x = resultSet.getRow();
if (x != 0){
String ersteSpalte = resultSet.getString(0);
}

mk
17-01-05, 17:14
Hallo Dieter,

vielen Dank für deine Hilfe

ich glaube Dir ja.............................

Ich bin auch schon ein bischen weitergekommen.
Wenn man allerdings die Syntax nicht so drauf hat
verläuft man sich ein bischen.

Jestzt suche ich gerade nach einem einfachen Loop
für das lesen.

Vielen Dank
Michael

BenderD
17-01-05, 17:21
Hallo Michael,

wie wärs mit:

while(resultSet.next())
{
machwas();
}

mfg

Dieter Bender

PS: und das JDBC Tutorial auf der sun Webseite ist wirklich gut!


Hallo Dieter,

vielen Dank für deine Hilfe

ich glaube Dir ja.............................

Ich bin auch schon ein bischen weitergekommen.
Wenn man allerdings die Syntax nicht so drauf hat
verläuft man sich ein bischen.

Jestzt suche ich gerade nach einem einfachen Loop
für das lesen.

Vielen Dank
Michael

mk
19-01-05, 13:09
Hallo Dieter,

vielen Dank für deine Hilfe, jetzt kommt aber nochmal eine Frage:

ich rufe im Java Programm einen OS400 Befehl auf.
wenn der Befehl durchläuft erhalte ich eine Messagelist

AS400Message[] msglist = cmd.getMessageList();
// wenn Nachrichtenm und Msg > 0
if (msglist.length > 0){
if (msglist[1].getSeverity() > 0){
for (int i=0; i < msglist.length; i++){
System.out.print ( msglist[i].getID() );
System.out.print ( ": " );
System.out.println( msglist[i].getText() );
int m = msglist[i].getSeverity();
ok = "error";
}}}


Jetzt meine Frage: Da ja unter Umständen mehrere Nachrichten auftauchen ist die Frage wie ich feststellen
kann ob der Befehl nun korrekt abgelaufen ist oder nicht.

Jetzt setzte ich den Fehler wenn
getSeverity > 0 ist.
Das klappt aber nur für die erste Nachricht..........

Gruss Michael

BenderD
19-01-05, 13:43
Hallo Michael,

sletsam, seltsam, warum sollte man aus Java einen OS/400 Command aufrufen, da würde ich mal über das Design nachdenken...
Wenn man das aber nun partout machen will:
AS400Message[] msglist = cmd.getMessageList();
liefert dir ein Array of AS400Message und mit msglist[i] kommst du an die Einträge dran (von i=0 bis messagelist.lenght() und getSeverity() liefert dir die Wertigkeit; mehr brauchst du doch nicht. Falls du dich für den Text oder sowas interessierts, dann schau mal in der DollBox Doku nach, was eine AS400Message so alles kann.

mfg

Dieter Bender


Hallo Dieter,

vielen Dank für deine Hilfe, jetzt kommt aber nochmal eine Frage:

ich rufe im Java Programm einen OS400 Befehl auf.
wenn der Befehl durchläuft erhalte ich eine Messagelist

AS400Message[] msglist = cmd.getMessageList();
// wenn Nachrichtenm und Msg > 0
if (msglist.length > 0){
if (msglist[1].getSeverity() > 0){
for (int i=0; i < msglist.length; i++){
System.out.print ( msglist[i].getID() );
System.out.print ( ": " );
System.out.println( msglist[i].getText() );
int m = msglist[i].getSeverity();
ok = "error";
}}}


Jetzt meine Frage: Da ja unter Umständen mehrere Nachrichten auftauchen ist die Frage wie ich feststellen
kann ob der Befehl nun korrekt abgelaufen ist oder nicht.

Jetzt setzte ich den Fehler wenn
getSeverity > 0 ist.
Das klappt aber nur für die erste Nachricht..........

Gruss Michael

mk
19-01-05, 14:34
Hallo Dieter,

es geht mir erstmal nicht um eine Designfrage. Ich
probiere nur verschiedene Zugriffsmethoden.

Trotzdem: Wir haben auf der 400 mehrere Test und
Produktionsumgebungen. Das switchen der Libarylist etc.
wird durch einen Command geregelt.
Warum sollte ich den nicht benutzten ?

Gruss Michael

BenderD
19-01-05, 14:59
Hallo,

weil das eine Eigenschaft der Connection ist und bei den Properties des Treibers eingestellt wird.
Im übrigen sollte man auch mal über Fug oder Unfug von Library Lists nachdenken!!!
Für das auffinden von Programmen und Properties ist das wohl in Ordnung, aber für die Lokalisierung von Dateien wohl ein übler Scherz: erst installiere ich eine Datenbank, die referentielle Integrität und allen Schmonz kann und dann geh ich her und sage aus welcher Bibliothek (= Datenbank) die einzelnen Dateien kommen ist mir wurscht.
Richtig wäre:
Verwendung Naming Conventions *SQL und default Schema benutzen; dann stellt man sicher, dass nur zusammen gehörige Daten verwendet werde.
Und sage mir keiner: bei uns funktioniert das Bestens, wer hat noch keine Applikation gesehen, die Lagerbestaände aus echt holt und in Test fakturiert!!!

mfg

Dieter Bender


Hallo Dieter,

es geht mir erstmal nicht um eine Designfrage. Ich
probiere nur verschiedene Zugriffsmethoden.

Trotzdem: Wir haben auf der 400 mehrere Test und
Produktionsumgebungen. Das switchen der Libarylist etc.
wird durch einen Command geregelt.
Warum sollte ich den nicht benutzten ?

Gruss Michael