Problem mit Java + SQL

Dafür ist die Sequence-Tabelle. Da wird immer der zuletzt benutzte Primärschlüssel gespeichert. Wenn du dann immer dort den Schlüssel ausliest, diesen erhöhst und den dann in dieser Tabelle speicherst, kann es nie zu Verwechselungen kommen.
Auf diese Art kannst du später eventuell auch die DB wechseln und bist nicht darauf angewiesen, ob die Datenbank autoincrement kann.

Beispiel:

Primärschlüssel: int (start 1)

Wenn du 5 Kunden angelegt hast, steht der Primärschlüssel bei 5 und steht auch so in der Sequence-Tabelle. Löschst du jetzt den letzten Kunden, ist in letzte Primärschlüssel in deiner Tabelle 4, aber in der Sequence-Tabelle steht immer noch 5. Beim nächsten erstellen eines Kunden liest du die 5 aus, erhöhst die wieder und schreibst sie zurück. Dann hat dein neuer Kunde die 6 und die 5 wird nicht wieder benutzt.

MFG

zEriX
 
Zuletzt bearbeitet:
Dafür ist die Sequence-Tabelle. Da wird immer der zuletzt benutzte Primärschlüssel gespeichert. Wenn du dann immer dort den Schlüssel ausliest, diesen erhöhst und den dann in dieser Tabelle speicherst, kann es nie zu Verwechselungen kommen.
Auf diese Art kannst du später eventuell auch die DB wechseln und bist nicht darauf angewiesen, ob die Datenbank autoincrement kann.

Beispiel:

Primärschlüssel: int (start 1)

Wenn du 5 Kunden angelegt hast, steht der Primärschlüssel bei 5 und steht auch so in der Sequence-Tabelle. Löschst du jetzt den letzten Kunden, ist in letzte Primärschlüssel in deiner Tabelle 4, aber in der Sequence-Tabelle steht immer noch 5. Beim nächsten erstellen eines Kunden liest du die 5 aus, erhöhst die wieder und schreibst sie zurück. Dann hat dein neuer Kunde die 6 und die 5 wird nicht wieder benutzt.

MFG

zEriX

Das hört sich gut an, das werde ich versuchen! Danke für eure Hilfe!

Liebe Grüße
 
Anmerkung:

klappt aber nur, wenn keine andere Anwendung Kunden erfasst. Wenn eine Sequenz-Tabelle verwendet wird, müssen alle Anwendungen diese benutzen....

Gruss
 
Hallo!

hatte erst heute die möglichkeit, das ganze auszuprobieren!

Ich hab mich jetzt für die MAX-Funktion entschieden, und diese geht (eigentlich) auch.
Dabei hab ich nur ein Problem:

Mit dem SQL Befehl frage ich die höchste KdNr ab, diese wird im ResultSet gespeichert. Wenn ich dieses ResultSet in einer while-Schleife auf der Konsole ausgebe - kein Problem!

Aber ich will das eigentlich in einer Variable speichern und erhalte dann den Fehler

Code:
Ungültiger Cursorstatus

Hab jetzt eine Weile rumprobiert, aber anstatt das Problem zu lösen immer mehr Fehlermeldungen bekommen.

Hoffe ihr könnt mir helfen!

Hier mein SQL Stmt:
Code:
                statement = connection.createStatement();
                result = statement.executeQuery("SELECT MAX(Kundennummer) as MaxKdNr FROM Kunden");

                // das funktioniert einwandfrei
                while(result.next()){
                    System.out.println(result.getInt(1));
                }

              // das allerdings nicht
              int kdnr = result.getInt(1);

Liebe Grüße
 
Also wenn du es so versuchst wie du es geschrieben hast kann es nicht funktionieren
da result ein Pointer auf die Ressource in der DB ist.


Java:
int kn;

while(result.next()){
       kn=result.getInt();
}
 
Nimm einfach ein if statt einem while

Java:
statement = connection.createStatement();
                result = statement.executeQuery("SELECT MAX(Kundennummer) as MaxKdNr FROM Kunden");

                int maxKdnr;
                if(result.next()){
                    maxKdnr=result.getInt(1);
                    // oder besser  maxKdnr=result.getInt("MaxKdNr");

                } else {

                  // Fehlerbehandlung
                }

Nach dem Ende von while steht der Cursor ja auf EOF, deswegen musst Du ein If verwenden.

Gruss
 
Nimm einfach ein if statt einem while

java Code:
  1. statement = connection.createStatement();
  2. result = statement.executeQuery("SELECT MAX(Kundennummer) as MaxKdNr FROM Kunden");
  3. int maxKdnr;
  4. if(result.next()){
  5. maxKdnr=result.getInt(1);
  6. // oder besser maxKdnr=result.getInt("MaxKdNr");
  7. } else {
  8. // Fehlerbehandlung
  9. }


Nach dem Ende von while steht der Cursor ja auf EOF, deswegen musst Du ein If verwenden.

Gruss

Super, danke! Du avancierst noch zu meiner Allzweck-Hilfe! :)

Aber noch eine Frage zum Schluß:
Du hast geschrieben,
Code:
maxKdnr=result.getInt("MaxKdNr");

sei besser als die andere Lösung, warum?
Nur damit ich es für die Zukunft weiss :)

Danke!

Liebe Grüße
 
Ich mag es grundsätzlich lieber, die Felder beim Namen zu nennen. Eine Änderung im Select kann eine Änderung der Position zur Folge habe, jedoch eher selten eine Änderung des Namens... ;)

Da in diesem Fall sowieso immer nur eine Spalte gewählt wird, ist es egal.

Gruß
 
Zurück