Daten zwischenspeichern

sinoptik

Mitglied
Hallo Zusammen,

ich bin gerade dabei eine MySql-DB auszulesen, klappt auch wunderbar.

mit
Java:
ResultSet rs = Stmt.executeQuery("SELECT KdNr, AuftrNr FROM TestDB");

            while (rs.next()) {
               	
            	System.out.println(rs.getString("KdNr") + "  " + rs.getString("AuftrNr"));
            }

bekomme ich die benötigten Daten raus.
Die Ausgabe sieht dann so aus:

Java:
27384  34954
49503  48596
49384  73849
...

Nun muss ich diese ausgegebenen Daten speichern um mit ihnen weitere Abfragen durchzuführen, wie z.B.
Java:
SELECT xyz FROM TestDB WHERE KdNr=27384 AND AuftrNr=34954
um nach weiteren Kriterien zu prüfen.

Wie kann ich das bewerkstelligen?

Für Antworten bedanke ich mich im Voraus.

VG
sinoptik
 
zum Beispiel eine Liste von Objekten einer neuen Klasse Auftrag mit String-Attributen kdNr usw?
 
Ich weiss jetzt nicht, wie du es meinst. Die ausgegebenen Daten sollen halt für weitere Queries genutzt werden:

z.B.
Java:
//nehme den ersten Datensatz und führe eine Abfrage durch
...Stmt.executeQuery("SELECT xyz FROM TestDB WHERE KdNr=27384 AND AuftrNr=34954");
//danach prüfe, ob ein bestimmtes Kriterium vorliegt
 ....

//dann nehme den nächsten Datensatz
...Stmt.executeQuery("SELECT xyz FROM TestDB WHERE KdNr=49503 AND AuftrNr=48596");
//danach prüfe, ob ein bestimmtes Kriterium vorliegt
 ....
usw.

Mein Problem ist das speichern und das abrufen der ausgegebenen Daten in der Weise, dass ich zuerst den ersten Datensatz (27384 34954), dann den zweiten (49503 48596) usw. für weitere Queries benutzen kann.
 
Mein Problem ist das speichern und das abrufen der ausgegebenen Daten in der Weise, dass ich zuerst den ersten Datensatz (27384 34954), dann den zweiten (49503 48596) usw. für weitere Queries benutzen kann.

zum Beispiel eine Liste von Objekten einer neuen Klasse Auftrag mit String-Attributen kdNr usw?

Genau so. Du ließt dir erst die Ergebnisse vom ersten Query ein und dann iterierst du über die Liste der Ergebnisse und führst für jeden Datensatz den zweiten Query aus.

Beispiel:
Java:
		List<Auftrag> aufträge = new ArrayList<Auftrag>();
		ResultSet rs = Stmt.executeQuery("SELECT KdNr, AuftrNr FROM TestDB");
		 
        while (rs.next()) {
            Auftrag auftrag = new Auftrag(rs.getInt("KdNr"),rs.getInt("AuftrNr");
            System.out.println(auftrag);
            aufträge.add(auftrag);
        }
        
        for(Auftrag auftrag : aufträge){
 
        	rs = Stmt.executeQuery("SELECT xyz FROM TestDB WHERE KdNr="+auftrag.getKdNr()+" AND AuftrNr="+auftrag.getAutragNr());
        	
        	while(rs.next()){
        		// do something
        	}
        }

Java:
public class Auftrag{
	int kdNr;
	int autragNr;
	
	public Auftrag(int kdNr, int auftragNr){
		this.kdNr = kdNr;
		this.autragNr = auftragNr;
	}
	
	public int getKdNr() {
		return kdNr;
	}
	public int getAutragNr() {
		return autragNr;
	}
	
	public String toString(){
		return kdNr + " " + autragNr;
	}
}

Und noch viel besser wird das ganze wenn du dann PreparedStatements verwendest 😉
 
Zuletzt bearbeitet von einem Moderator:
Hallo, ich nochmal mit einem Problem,

ich habe es nun nach Eurem Vorschlag umgesetzt. Funktioniert einwandfrei, danke nochmals. Ich hole mir zuerst die benötigten Daten aus der DB, speichere sie und nutze sie zur Prüfung weiterer Kriterien.
Meine DB sieht so aus:
Code:
Datum                    AuftrNr      xId   Besuche   Käufe
2011-01-23 21:00:00      123456      3698     569       6
2011-01-23 22:00:00      123456      3698     612       8
2011-01-24 00:00:00      123456      3698      12       1
2011-01-24 01:00:00      123456      3698      35       2

Die Besuche und Käufe werden fortlaufend hinzuaddiert, d.h. dass z.b. um 22:00:00 es 2 Käufe bzw. 43 Besuche gab. Der Datensatz für "2011-01-23 23:00:00" fehlt, weil es da 0 Klicks gab. Ich möchte nun die fehlenden Datensätze ergänzen. Dabei müssen die Besuche und Käufe vom vorherigen Datensatz übernommen werden, also so:

Code:
2011-01-23 23:00:00      123456      3698     612       8

Das klappt auch teilweise. Der Haken ist, dass die Besuche und Käufe vom nächsten Datensatz übernommen werden, also so:
Code:
2011-01-24 23:00:00      123456      3698      12       1
und ich kriege das nicht in den Griff.

So sieht meine Schleife aus:
Java:
while(rs.next()) {
            		Daten dat = new Daten(rs.getTimestamp("date"), rs.getString("AuftrNr"), rs.getString("xID"), rs.getInt("besuche"), rs.getInt("käufe"));   
            		daten.add(dat);		
            	}
            	
            	long ONE_HOUR = 60*60*1000;
            	java.util.Date oldTime = null;
            	//conn.setAutoCommit(true);
            	
            	for(int i=0; i<daten.size();){
            		Daten2 dat = daten.get(i);
            		
            		if(oldTime != null && dat.getDate().getTime() - oldTime.getTime() > ONE_HOUR) {
            			
            			calendar.setTime(oldTime);
            			calendar.add(Calendar.HOUR_OF_DAY, 1);
            			oldTime = calendar.getTime();
            			
            			//Wenn Uhrzeit = 00:00:00, beginne Zählung der Besuche und Käufe von vorne
            			if((df.format(calendar.getTime()).substring(11,19).equals("00:00:00"))){
            				String statement = "INSERT INTO myDB (date, AuftrNr, xId, Besuche, käufe) VALUES ('" + df.format(calendar.getTime()) + "','"+ dat.getAuftrNr()+"', '"+ dat.getxId()+"', '0','0')";
            			}
            			
            			else {
            			String statement = "IINSERT INTO myDB (date, AuftrNr, xId, Besuche, käufe) VALUES ('" + df.format(calendar.getTime()) + "','"+ dat.getAuftrNr()+"', '"+ dat.getxId()+"', '"+ dat.getBesuche()+ "','"+ dat.getKäuefe()+ "')";
            			Stmt.executeUpdate(statement);
						
            			}		
            		}
					else{
						oldTime = dat.getDate();
						i++;
					}

Es wird auch das richtige Datum eingefügt. Nur weiss ich nicht, wie ich die vorherigen Datensätze für Besuche und Käufe merken soll.
Bitte um Unterstützung.

Vielen Dank
 
java.util.Date oldTime = null;
->
Daten oldDaten = null;

oldTime = dat.getDate();
->
oldDaten = dat;


if(oldTime != null && dat.getDate().getTime() - oldTime.getTime() > ONE_HOUR) {
->
if(oldDaten != null && dat.getDate().getTime() - oldDaten.getDate().getTime() > ONE_HOUR) {

und insbesondere das INSERT dann nicht mit dat.getBesuche() sondern oldDaten.getBesuche() usw.!
zum restlichen Code-Aufbau könnte man auch lange schreiben, aber naja..
 
Danke für die schnelle Antwort.
Jetzt wird zwar der vorherige Wert genommen, allerdings komme ich dann in eine Endlosschleife.

Ausgabe:
Code:
2011-01-23 23:00:00      123456      3698     612       8
2011-01-24 00:00:00      123456      3698       0       0
2011-01-24 01:00:00      123456      3698     612       8
2011-01-24 02:00:00      123456      3698     612       8
2011-01-24 03:00:00      123456      3698     612       8
...

vg sinoptik
 
Zuletzt bearbeitet:
tja, Zeile 17 habe ich im letzten Vorschlag nicht gesehen, keine Vorstellung was bei der ganzen Sache ungefähr zu tun ist?
wenn du den ersten Code selber geschrieben hast muss dir die Wichtigkeit von Zeile 17 doch bewußt sein,

du könntest nun entweder die Variable oldTime doch auch noch behalten und parallel mitführen, updaten und im if prüfen statt oldDaten.getTime(),
oder nur bei oldDaten bleiben und in oldDaten die Zeit aktualisieren wie du oldTime in Zeile 17 änderst,
wenn du oldDaten ansonsten nicht mehr brauchst ist das weitgehend in Ordnung
 

Zurück
Oben