Anmelden

View Full Version : [Dringend][JT400,JDBC] Insert bricht mit 'Cursor state not valid' ab.



LoCal
10-12-04, 13:26
Hallo,

ich versuche hier in eine Tabelle zu schreiben. Aber obwohl der Insert-String sowohl syntaktisch Korrekt ist und von den Feldern her auch passt, kann ich nicht schreiben und erhalte nur die Fehlermeldung "Cursor state not valid"

Wo liegt hier das Problem? Die Datenbankdatei wurde von mir erstellt und der zugriff erfolgt auch durch meinen user.

Vielen Dank für die Hilfe,


LoCal

BenderD
10-12-04, 13:43
Hallo,

Cursor state not valid deutet normalerweise auf einen Fehler in der Applikation hin, ohne Source geht da für uns garnix.

mfg

Dieter Bender


Hallo,

ich versuche hier in eine Tabelle zu schreiben. Aber obwohl der Insert-String sowohl syntaktisch Korrekt ist und von den Feldern her auch passt, kann ich nicht schreiben und erhalte nur die Fehlermeldung "Cursor state not valid"

Wo liegt hier das Problem? Die Datenbankdatei wurde von mir erstellt und der zugriff erfolgt auch durch meinen user.

Vielen Dank für die Hilfe,


LoCal

LoCal
10-12-04, 14:08
Hallo,

Cursor state not valid deutet normalerweise auf einen Fehler in der Applikation hin, ohne Source geht da für uns garnix.

mfg

Dieter Bender


Also den ganzen Quellcode kann ich logischerweise nicht posten.. darum poste ich mal das was ich in die engere Wahl ziehen.

Ich habe mir mal schon vor längerer Zeit einen Klasse gemacht, die ich für den Zugriff auf versch. Datenbanken nutzen kann.

Die Methode die fürs executes zuständig sieht wie folgt aus:


public void command(String sqlcmd) {
try {
java.sql.Statement st = c.createStatement();
st.executeQuery(sqlcmd);
st = null;
} catch (SQLException e) {
//Exception Handling
}
}



Die, in der ich dann den Insert-String erstelle:


private void erstelleSQLStrings() {
sqlStatements = new LinkedList();
LinkedList sqlSatz = null;
SQLElement tmp = null;
for(int i = 0;i<Stat_vars.sqlSaetze.size();i++) {
insertInto = new StringBuffer();
values = new StringBuffer();
sqlSatz = (LinkedList)Stat_vars.sqlSaetze.get(i);
for(int j=0;j<sqlSatz.size();j++) {
tmp = (SQLElement)sqlSatz.get(j);
insertInto.append(tmp.getFeld()+", ");
values.append(tmp.getWert()+", ");
}
sqlStatements.add((new String("INSERT INTO "+
+Stat_vars.ZIELDATEI +" ("+insertInto.substring(0,insertInto.length()-2) +
") VALUES(" + values.substring(0,values.length()-2) + ")")));
}




Diese Methode übernimmt dann quasi das eintrage:


private void verarbeiteSQLStrings() {
Stat_vars.verbindeDB();
for(int i=0;i<sqlStatements.size();i++) {
Stat_vars.sqlAnfrage((String)sqlStatements.get(i)) ;
}
}


Und der daraus erzeugte SQL-String sieht wie folgt aus:


INSERT INTO GB311S (GLSS01, GLSS02, GLSS03, GLSS04, GLSS05, GLSS06, GLSS07, GLSS08, GLSS09, GLSS10, GLSS11) VALUES(85203879005, 20041208, 8500, 2011, 20041208, 0000, 'Müller', 51047, '3SPS80644954-001', '0', 'NixName')


Wie gesagt in Sachen Feldtypen passt alles.

Achja.. die von mir erwähnte Datenbankklasse ist ein statisches Object.

Wie gesagt, das sind die "betroffenen" Teile.

LoCal
10-12-04, 14:23
Hallo,

Cursor state not valid deutet normalerweise auf einen Fehler in der Applikation hin, ohne Source geht da für uns garnix.

mfg

Dieter Bender

Hmm.. noch ne kleine Nachfrage:
Also die Nachricht kommt ja von der "SQLException" und die bezieht sich ja quasi nur auf den SQL-String.
Was halt also der eigentliche Quellcode damit zu tun?

BenderD
10-12-04, 15:03
Hmm.. noch ne kleine Nachfrage:
Also die Nachricht kommt ja von der "SQLException" und die bezieht sich ja quasi nur auf den SQL-String.
Was halt also der eigentliche Quellcode damit zu tun?

Hallo,

ich fange mal mit dem obigen an: Cursor state not valid deutet auf einen Folgefehler - z.B.: ein resultSet wird geschlossen und dann kommt Cursor state not valid beim next(). Auf deinen Fehler bezogen würde man diese Meldung erwarten, wenn man über ien ResultSet einfügt, was nicht der Fall ist, was ich aber ohne Quellcode nicht sehe.
Bist du sicher, dass der Fehler beim Insert auftritt, oder könnte das nicht eins später sein?
Bist du sicher, dass dein Statement lokale Variable ist?
Ein Statement kann nämlich nur ein ResultSet und ein vorhandenes wird beim re execute geschlossen.
Läuft das ganze im Multithreaded Umfeld? (Servlet, EJB o.ä.)

mfg

Dieter Bender

LoCal
10-12-04, 15:14
Hallo,

erstmal danke für die schnelle antwort. Also das mit dem String und seiner Übergabe bis zum "Ziel" passt. Das habe ich per debuggin verfolgt.
Mittlerweile nehm ich auch nicht mehr executeQuery() (weiss selbst nicht warum ich das genommen habe), sondern executeUpdate() das liefert ja kein ResultSet zurück.
Und es läuft auch ohne Exception-wurf durch, aber eingetragen werden die Daten immer noch nicht.

Ich werde am Montag alles noch mal genau duruchchecken und nochmal hier rein posten.. die dringlichkeit is erstmal nicht mehr gegeben ...

für jetzt schonmal vielen Dank und schönes Wochenende.

LoCal
13-12-04, 07:22
So, habe nochmal alles soweit durchgesehen... also von der CodeSeite her passt es. Also das Problem liegt wohl auf der Maschinenseite. Die Datei hatte ich mit "Super-Base" erstellt.
Werden eventuelle JDBC-Zugriffsprobleme auf der AS/400 irgendwo geloggt?

BenderD
13-12-04, 08:36
Hallo LoCal,

log ist das Joblog des Database Server Jobs, aber da findest du auch nur Cursorstate not valid. Pack doch mal den Code, von dem du glaubst, dass er nicht funktioniert in ein kleines main; mit genau einem insert und dann poste mal diesen Code und die genaue Fehlermeldung, wenn es denn wirklich nicht funzt.

Dieter Bender


So, habe nochmal alles soweit durchgesehen... also von der CodeSeite her passt es. Also das Problem liegt wohl auf der Maschinenseite. Die Datei hatte ich mit "Super-Base" erstellt.
Werden eventuelle JDBC-Zugriffsprobleme auf der AS/400 irgendwo geloggt?

LoCal
13-12-04, 11:01
Okie.. es war ein Programm-fehler.

Ich habe die Klasse, die ich mir mal für Datenbankzugriffe geschrieben habe, statisch geladen. Nun greift die zu erst auf eine Datei in Bibliothek A zu und die zu manipulirende Datei ist in Bibl. B.
Wenn ich nun über die schon vorhandene Instanz der Datenbankzugriffsklasse arbeiten will geht nix.
Ich habe jetzt noch eine eigene Instanz erstellt und nun gehts.
Is zwar nicht so nach meinem Geschmack, aber vorerst bleibt es so weil es funzt.

Danke nochmal für die Hilfe.

LoCal