SQL ResultSet Previous

jothemac

Mitglied
Hallo,

ich habe eine menge daten in einer mysql datenbank gespeichert. Nun möchte ich mit diesen berechnungen anstellen: Ich möchte den ersten eintrag nehmen und den mit dem 2 subtrahieren. Danach wieder zu eintrag 2 springen und dann eintrag 2 mit 3 subtrahieren und so weiter.... Das versuche ich so:
Java:
 public void calculateOpeningChangeDayBefore()
    {
        try
        {
            PreparedStatement ps = dbHelper.conn.prepareStatement(
                          "SELECT DATE,OPENING FROM APP."+StockName.toUpperCase());
            ResultSet rs = ps.executeQuery();
                  
            while(rs.next())
            {
                System.out.println("OPENING DAY 1:"+rs.getString(1));
                rs.next();
                System.out.println("OPENING DAY 2:"+rs.getString(1));
                rs.previous();
            }
                  
        }
        catch(SQLException ex)
        {
            ex.printStackTrace();
            System.out.println("COULD NOT CALCULATE OPENING CHANGE DAY BEFORE");
        }
    }

Das Problem ist das er bei rs.previous() einen fehler meldet, aber ohne fehler ausgabe....
 
Zuletzt bearbeitet:

turtle

Top Contributor
Du kannst beim Erzeugen des Statements angeben, dass Du im ResultSet scrollen möchtest.

Java:
conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
 

jothemac

Mitglied
Danke sehr, das hat das problem gelöst. Ich hätte da noch eine frage. Und zwar möchte ich die daten einer table für eine bestimmte column updaten. Das sieht bei mir so aus:
Java:
PreparedStatement ps2 = dbHelper.conn.prepareStatement(
                                  "UPDATE APP."+StockName.toUpperCase()+ 
                        "(OPENCHANGEDAYBEFORENUMBER, OPENCHANGEDAYBEFOREPERCENT,"
                            + "HIGHCHANGEDAYBEFORENUMBER, HIGHCHANGEDAYBEFOREPERCENT,"
                            + "LOWCHANGEDAYBEFORENUMBER, LOWCHANGEDAYBEFOREPERCENT,"
                            + "CLOSECHANGEDAYBEFORENUMBER, CLOSECHANGEDAYBEFOREPERCENT,"
                            + "VOLUMECHANGEDAYBEFORENUMBER, VOLUMECHANGEDAYBEFOREPERCENT,"
                            + "ADJCLOSECHANGEDAYBEFORENUMBER, ADJCLOSECHANGEDAYBEFOREPERCENT) "
                        + "VALUES("
                        +Float.valueOf(diffNumberOpening).floatValue()+","
                        +Float.valueOf(diffPercentOpening).floatValue() +","
                        +Float.valueOf(diffNumberHigh).floatValue()+","
                        +Float.valueOf(diffPercentHigh).floatValue()+","
                        +Float.valueOf(diffNumberLow).floatValue()+","
                        +Float.valueOf(diffPercentLow).floatValue() +","
                        +Float.valueOf(diffNumberClosing).floatValue()+","
                        +Float.valueOf(diffPercentClosing).floatValue()+","
                        +Float.valueOf(diffNumberVolume).floatValue()+","
                        +Float.valueOf(diffPercentVolume).floatValue()+","
                        +Float.valueOf(diffNumberAdjClose).floatValue()+","
                        +Float.valueOf(diffPercentAdjClose).floatValue()+")");

Jetzt würde ich gerne wissen wie ich sagen kann das das update für column 1,2... und so weiter gemacht werden soll.
 
N

nillehammer

Gast
Schreib in Dein Statement in die Klammern nur die Namen der Columns, die Du wirklich updaten willst und gib nur dafür Values an.

P.S. Dein Java-Code geht etwas eleganter. Statt dem hier:
Java:
Float.valueOf(diffNumberOpening).floatValue()
Schreibe das:
Java:
Float.parseFloat(diffNumberOpening)
Und die mehrfache String-Konkatenierung mit dem "+"-Operator ersetzt Du besser durch
Code:
StringBuilder.append
:
Java:
StringBuilder statementStr = new StringBuilder();
statementStr.append("UPDATE APP.").append(StockName.toUpperCase())
// usw.
dbHelper.conn.prepareStatement(statementStr.toString());
 
Zuletzt bearbeitet von einem Moderator:

jothemac

Mitglied
Die columns haben keinen Namen(max datum), ich würde es gerne so machen:
Update daten xy in column der reihe(also dessen platzt in der Tabelle) xy der tabelle xx.
 
N

nillehammer

Gast
Die columns haben keinen Namen
Das gibt es nicht. UPDATES kannst Du nur auf Tabellen machen. Dort hat jede Column einen Namen.
Update daten xy in column der reihe(also dessen platzt in der Tabelle) xy der tabelle xx.
In SQL-Updatestatements gibt es sowas wie Spaltenindizes nicht. Du könntest aber die Angabe von Spaltennamen umgehen, indem Du die Klammern mit den Columnnames komplett weglässt und bei Values Werte für alle Spalten angibst. Die, die verändert werden sollen, enthalten neue Werte. Die die gleich bleiben sollen, enthalten die Werte, die schon drinnen stehen. Die Reihe wählst Du über eine entsprechende WHERE-Klausel aus.
 
Zuletzt bearbeitet von einem Moderator:

jothemac

Mitglied
Müsste das ganze nicht ungefähr so aussehen?

Java:
PreparedStatement ps2 = dbHelper.conn.prepareStatement(""
                                + "UPDATE APP."+StockName.toUpperCase()+
                                " SET OPENCHANGEDAYBEFORENUMBER = ?, SET OPENCHANGEDAYBEFOREPERCENT = ?"
                                +"SET HIGHCHANGEDAYBEFORENUMBER = ?, SET HIGHCHANGEDAYBEFOREPERCENT = ?,"
                                +"SET LOWCHANGEDAYBEFORENUMBER = ?, SET LOWCHANGEDAYBEFOREPERCENT = ?,"
                                +"SET CLOSECHANGEDAYBEFORENUMBER = ?, SET CLOSECHANGEDAYBEFOREPERCENT = ?,"
                                +"SET VOLUMECHANGEDAYBEFORENUMBER = ?, SET VOLUMECHANGEDAYBEFOREPERCENT = ?"
                                +"SET ADJCLOSECHANGEDAYBEFORENUMBER = ?, SET ADJCLOSECHANGEDAYBEFOREPERCENT = ?"
                                +" WHERE DATE = ?");
                        ps2.setFloat(1, diffNumberOpening);
                        ps2.setFloat(2, diffPercentOpening);
                        ps2.setFloat(3, diffNumberHigh);
                        ps2.setFloat(4, diffPercentHigh);
                        ps2.setFloat(5, diffNumberLow);
                        ps2.setFloat(6, diffPercentLow);
                        ps2.setFloat(7, diffNumberClosing);
                        ps2.setFloat(8, diffPercentClosing);
                        ps2.setFloat(9, diffNumberVolume);
                        ps2.setFloat(10, diffPercentVolume);
                        ps2.setFloat(11, diffNumberAdjClose);
                        ps2.setFloat(12, diffPercentAdjClose);
                        ps2.setString(13, date);
 
N

nillehammer

Gast
Sieht gut aus.

In Deinen vorherigen Posts waren die ganzen Variablen
Code:
diffNumberOpening etc.
noch Strings, die Du erst nach
Code:
float
geparst hast. Ich nehme an, dass Du das inzwischen so geändert hast, dass diese Variablen jetzt schon vom Typ
Code:
float
sind? Denn sonst würde Dein Code ja nicht kompilieren.

Und das hier:
[JAVA=22]
ps2.setString(13, date);
[/code]
sieht mir auch noch etwas verdächtig aus. Das geht nur, wenn 1.
Code:
date
vom Typ String ist und 2. in der Datenbanktabelle die entspr. Column vom Typ VARCHAR ist. Sollte sie ein Date-Typ sein, müsstest Du mit java.sql.Date und der entspr. setDate-Methode des PreparedStatement arbeiten.
 

jothemac

Mitglied
SO ich habe es jetzt hinbekommen und zwar so:
Java:
try
                    {
                        
                        PreparedStatement ps2 = dbHelper.conn.prepareStatement(""
                                + "UPDATE APP."+StockName.toUpperCase()
                                +" SET OPENCHANGEDAYBEFORENUMBER = ? , OPENCHANGEDAYBEFOREPERCENT = ?,"
                                +"  HIGHCHANGEDAYBEFORENUMBER = ?,  HIGHCHANGEDAYBEFOREPERCENT = ?,"
                                +"  LOWCHANGEDAYBEFORENUMBER = ?,  LOWCHANGEDAYBEFOREPERCENT = ?,"
                                +"  CLOSECHANGEDAYBEFORENUMBER = ?,  CLOSECHANGEDAYBEFOREPERCENT = ?,"
                                +"  VOLUMECHANGEDAYBEFORENUMBER = ?,  VOLUMECHANGEDAYBEFOREPERCENT = ?,"
                                +"  ADJCLOSECHANGEDAYBEFORENUMBER = ?,  ADJCLOSECHANGEDAYBEFOREPERCENT = ?"
                                +" WHERE DATE = ?");
                        ps2.setDouble(1, Float.valueOf(diffNumberOpening).floatValue());
                        ps2.setDouble(2, Float.valueOf(diffPercentOpening).floatValue());
                        ps2.setDouble(3, Float.valueOf(diffNumberHigh).floatValue());
                        ps2.setDouble(4, Float.valueOf(diffPercentHigh).floatValue());
                        ps2.setDouble(5, Float.valueOf(diffNumberLow).floatValue());
                        ps2.setDouble(6, Float.valueOf(diffPercentLow).floatValue());
                        ps2.setDouble(7, Float.valueOf(diffNumberClosing).floatValue());
                        ps2.setDouble(8, Float.valueOf(diffPercentClosing).floatValue());
                        ps2.setDouble(9, Float.valueOf(diffNumberVolume).floatValue());
                        ps2.setDouble(10, Float.valueOf(diffPercentVolume).floatValue());
                        ps2.setDouble(11, Float.valueOf(diffNumberAdjClose).floatValue());
                        ps2.setDouble(12, Float.valueOf(diffPercentAdjClose));
                        ps2.setString(13, dateTemp);
                    }
                    catch(SQLException ex)
                    {
                        ex.printStackTrace();
                    }

Wichtig ist: das agrument SET nicht wiederholen! Das habe ich öfter im inet gesehen. Nun ist etwas komisches passiert. Die berechnungen sind richtig, das habe ich über die konsole nach geschaut. Nur wenn ich die werte nun wieder aus der datenbank auslesen möchte, sind sie 11 von 10 null, und der 11 Eintrag ist vollkommen verkehrt. Irgendwie geht da was verloren, oder eher beim schreiben was schief. Ja alle variablen(bis auf dateTemp), sind Float variablen, die Tabelle erwartet für die einträge den mySQL-Typ DOUBLE.

Etwas peinlich aber: ich habe einfach den verkerten query genutzt:
Java:
                        ps2.executeUpdate();

Damit geht's ;)
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Ja, das mit den diversen SETs hatte ich auch so gefunden. Gut, dass Du rausgefunden hast, dass man das garnicht braucht bzw., dass es sogar schlicht falsch ist.

Bei den Datentypen musst Du aber -glaube ich- noch sauberer arbeiten.
  • Ja alle variablen(bis auf dateTemp), sind Float variablen,
    Dein Code sagt hier was anderes. Wenn die Variablen schon vom typ
    Code:
    float
    wären, müsstest du ja nicht die ganzen valueOf-Aufrufe machen.
  • Wie schon in einem meiner letzten Posts geschrieben, kannst Du mit parseFloat(...) Deinen Code verkürzen.
  • Du verwendest
    Code:
    ps.setDouble
    , weil die Spalten den mySql-Typ Double haben. Dann solltest Du auch doubles übergeben mit
    Code:
    Double.parseDouble(...)
    .

Nur wenn ich die werte nun wieder aus der datenbank auslesen möchte, sind sie 11 von 10 null,
Nur eine Spekulation, aber vielleicht fehlt hier ein Commit. Entweder in Form der autoCommit-Einstellung beim Erzeugen der Connection oder durch expliziten Aufruf von commit() auf dem Connection-Objekt.
[EDIT]Ok, der letze Punkt hatte eine andere Ursache...[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3
F generelle Vorgehensweise ResultSet Datenbankprogrammierung 5
S ResultSet Datenbankprogrammierung 2
A MySQL ResultSet.updateBytes schlägt fehl Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
D ResultSet gibt nichts aus. Datenbankprogrammierung 3
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
J jdbc ResultSet types Datenbankprogrammierung 5
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
F ResultSet to String[] Datenbankprogrammierung 3
E ResultSet in HashMap Datenbankprogrammierung 8
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
M Problem mit ResultSet bei SQL Server 2005 Datenbankprogrammierung 6
S ResultSet in ArrayList ablegen Datenbankprogrammierung 17
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
T ResultSet initialisieren Datenbankprogrammierung 2
C kein Resultset Datenbankprogrammierung 2
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
S ResultSet variabel auslesen Datenbankprogrammierung 4
D Anzahl der Elemente im ResultSet ermitteln Datenbankprogrammierung 8
A Leeres ResultSet mit H2 unter Vista Datenbankprogrammierung 3
A Warum ist mein ResultSet leer? Datenbankprogrammierung 5
S ResultSet closed Datenbankprogrammierung 2
Z ResultSet mit einer anderen Datenquelle Datenbankprogrammierung 7
O Spaltenname aus Resultset Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
E ResultSet vergisst Reihe? Datenbankprogrammierung 2
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
F ResultSet refresh moeglich? Datenbankprogrammierung 3
S ResultSet enthält keine Daten Datenbankprogrammierung 2
B Geschlossenes ResultSet Datenbankprogrammierung 6
T ResultSet#next Ungültige Reihenfolge (DB2) Datenbankprogrammierung 5
T ResultSet schließen? Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
S ResultSet Datenbankprogrammierung 6
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
@ Like-Klausel; NPE bzw. leeres ResultSet Datenbankprogrammierung 4
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
B No ResultSet was produced Datenbankprogrammierung 2
S ResultSet erweitern ? Datenbankprogrammierung 4
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
RaoulDuke ResultSet - Wie arbeitet sowas intern Datenbankprogrammierung 2
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
T MAX und ResultSet#next Datenbankprogrammierung 10
R ResultSet zu bestimmtem DS navigieren Datenbankprogrammierung 4
S .leeres Resultset abfangen Datenbankprogrammierung 2
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben