Benutzerregistrierung: Doppelt registriert.

Status
Nicht offen für weitere Antworten.

Reality

Top Contributor
Hi,
sorry für die dumme Überschrift.
Ich habe folgendes Problem: Ich bin noch ein Newbie in JAVA und ich habe mal aus Juchs ein kleines Prog gebastelt, wo man sich anmelden, registrieren und die Benutzer anzeigen kann.
Wenn sich nun jemand registriert, wird der Benutzer in der MSAccess-Datenbank 2 mal eingetragen.

Findet vielleicht jemand von euch den Fehler?!
Code:
void btAnmelden_actionPerformed(ActionEvent e) {
String anmeldeBenutzer, anmeldePasswort, sqlAnmeldung;
anmeldeBenutzer=tfAnmelden.getText();
anmeldePasswort=tfPasswort.getText();
sqlAnmeldung="INSERT INTO Tabelle1 (Benutzername, Passwort) VALUES('" +anmeldeBenutzer+ "','" +anmeldePasswort+ "')";

try{
      Statement stmt = connDB.createStatement();
      boolean result = stmt.execute(sqlAnmeldung);
      lbErfolgreich.setText("Registration erfolgreich");

if(tfAnmelden.getText().equals("")){
lbErfolgreich.setText("Bitte Benutzernamen eingeben!");
}

}catch (SQLException f){
lbErfolgreich.setText("Registration nicht erfolgreich!");
      System.out.println(f.getMessage());
      f.printStackTrace();
      System.out.println(f.getErrorCode());
}
  }

Danke!

Liebe Grüße
Realiry
 
S

stev.glasow

Gast
???:L also ich seh nix, kannst du etwas mehr code posten ?
 
B

bygones

Gast
und ob das eine Fangfrage sein soll oder ob wirklich etwas nicht klappt ??

Wird eine Exception geworfen oder macht er nur was falsch....
 

Nobody

Top Contributor
ich habe das so rausgelesen (trippel post zum nachobenschieben, mag ich garnicht, dass ist in zukunft zu unterlassen):
keine fehler, doch das ganze ist 2mal eingetragen.


aber man braucht wirklich mehr code um was erkennen zu können
 

Reality

Top Contributor
Hi,
wie gesagt, es kommt keine Fehlermeldung. An der Datenbank erkenne ich nur, dass ein User plötzlich 2 mal angetragen wurde.
Ich dachte, dass die anderen Codes nicht relevant sind, aber gut....

Code:
void btStart_actionPerformed(ActionEvent e) {
try{
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     tfStart.setText("Treiber egistriert");

     try{
       connDB=DriverManager.getConnection("jdbc:odbc:PasswortAbfrage","",""); /*connDB wurde ganz oben deklariert (hier nicht sichtbar) */
       tfStart.setText("Verbindung hergestellt");
     }
     catch (Exception ex){
       tfStart.setText("Fehler beim Verbindungsaufbau");
     }
    }
    catch (Exception ex){
      tfStart.setText("Fehler beim Registrieren des Treibers");
    }
  }

Code:
void btLogin_actionPerformed(ActionEvent e) {
String benutzer, passwort, sqlAnweisung;
    benutzer=tfBenutzer.getText();
    passwort=tfPass.getText();


    sqlAnweisung="SELECT Benutzername, Passwort FROM Tabelle1 WHERE Benutzername='"+benutzer + "'";
    try{
      PreparedStatement pStat; //Erzeugen eines Übergabeobjektes an die DB
      pStat=connDB.prepareStatement(sqlAnweisung);

      ResultSet rSet;
      rSet=pStat.executeQuery(); //SQL-Anweisung ausführen
      rSet.next();
   if(rSet.getString("Passwort").equals(passwort)){
     lbAusgabe.setText("Erfolgreich eingeloggt!");
   }
   else{
     lbAusgabe.setText("Benutzername oder Kenntwort ist falsch");
   }


    } catch (Exception ex){
      lbAusgabe.setText("Fehler beim Lesen der Kundendaten");
    }
  }

Code:
void btLogout_actionPerformed(ActionEvent e) {
lbAusgabe.setText("");
    try{
          connDB.close();
    lbCloseOutput.setText("Logout erfolgreich!");
        }catch (Exception ex){
          lbCloseOutput.setText("Fehler beim Logout");
        }
  }

Code:
void btAnzeigen_actionPerformed(ActionEvent e) {
String sqlAnzeigen, benutzernamen="";
sqlAnzeigen="SELECT Benutzername FROM Tabelle1 order by benutzername desc";

try{
      PreparedStatement pStat; //Erzeugen eines Übergabeobejktes an die DB
      pStat= connDB.prepareStatement(sqlAnzeigen);
      ResultSet rSet;         //Erzeugen eines Rückgabeobejektes zum Speichern der Antworttabelle
      rSet= pStat.executeQuery();   //SQL-Anweisung ausführen
      while (rSet.next()){        // oder (rSet.next()==true)
        benutzernamen=rSet.getString("Benutzername")+ "\n" + benutzernamen;
      }
      tBenutzer.setText(benutzernamen);

      }catch (Exception fa){
      tBenutzer.setText("Anzeigen der Benutzer fehlgeschlagen!");
      }
  }
}

Liebe Grüße
Reality
 

René Link

Aktives Mitglied
Hi,

ich kann leider auch keinen Fehler sehen. Was ich aber sehen kann ist, dass
du nicht verstanden hast, wie jdbc funktioniert.

Kennst du den Unterschied zwischen dynamischen und statischem SQL? Weißt du
was execute immediate und prepare execute ist?

Hier ein kleines Bild, was dir schon einmal einen Überblick verschaffen sollte.
Das Bild findest du auf http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odch02pr_7.asp
Der Artikel ist zwar über odbc, aber da odbc sowie jdbc auf dem Standard für SQL CLI (Call-Level Interface) beruhen,
welcher von der X/Open SQL Access Group 1992 vereinbart wurde ist die Implementierung ziemlich identisch.

pr03.gif


JDBC ist dynamisches SQL und da gibt es die zwei Varianten execute immediate und prepare execute.

execute immediate
Hierbei handelt es sich um eine Technik bei der das SQL Statement an die Datenbank geschickt wird und dort
alle Ebenen auf einmal durchläuft. Es wird geparst, optimiert, ein Zugriffsplan erstellt und dann wird es ausgeführt.
Das was du bei einem SELECT zurück bekommst ist eine Ergebnismenge. Diese befindet sich aber nicht auf dem Client.
Also in deinem Programm, sondern auf der Datenbank. Was du zurück bekommst ist ein sogenannter Cursor. Dieser
zeigt vor die erste Zeile der Ergebnismenge. Deshalb benutzt man die next-Methode der ResultSet-Klasse um den Cursor
auf die erste Zeile der Ergebnismenge zu bewegen. Solch eine Abfrage, wo man eine Ergebnismenge erwartet wird mit
der executeQuery-Methode ausgeführt.
Es gibt aber auch noch Statements, welche keine Ergebnismenge
liefern. Zum Beispiel bei UPDATE oder INSERT. UPDATE liefert zum Beispiel die Anzahl der geänderten Zeilen.
Für solche Anfragen steht die executeUpdate-Methode zur Verfügung.
Zu guter letzt gibt es auch noch den Fall, dass man nicht weiß, ob eine Ergebnismenge oder nur ein Zahlenwert zurück
gegeben wird. Das kann zum Beispiel dann passieren, wenn du ein Programm schreibst, in dem der Benutzer selbst
SQL-Statements eingeben und ausführen kann. Für solche Fälle ist die execute-Methode vorgesehen. diese gibt einen
boolean zurück. true, wenn die Ausführung des Statements eine Ergebnismenge erzeugt hat und false, wenn entweder ein Zahlenwert oder keine Ergebnismenge zurückgegeben wurde. Wenn du dann weißt, um was es
sich handelt, kannst du mit der getResultSet-Methode dir das ResultSet geben lassen oder mit der
getUpdateCount-Methode den Zahlenwert.



prepare execute
Hierbei wird mit prepare die Datenbank beauftragt, dass SQL-Statement zu parsen, validieren, optimieren und den Zugriffsplan
zu erstellen. Das Statement wird aber noch nicht ausgeführt. Wie die Datenbank das PreparedStatement intern
behandelt ist Implementierung. Meist wird die Datenbank StoredProcedures verwenden. Erst wenn man auf das PreparedStatement die execute, executeUpdate oder executeQuery-Methode aufruft, wird es auf der Datenbank ausgeführt.
Stellt sich jetzt nur noch die Frage wofür das Ganze gut ist.
Nehmen wir an in deiner Anwendung gibt es einen Such-Dialog. Der Benutzer kann hier Suchbegriffe eingeben. Dann
gibt es noch eine Schaltfläche zum Abfragen der Datenbank. Jetzt wäre es von der Performance her ungünstig jedesmal,
wenn der Benutzer auf die Schaltfläche klickt, ein Statement-Objekt sich zu besorgen und dann die executeQuery-Methode
aufzurufen. Warum? Weil nun die Datenbank die ganze Prozedur (parsen, validieren, optimieren, Zugriffsplan, ausführen)
durchführen muss (siehe Bild). Und das bei jeder Abfrage.
Wie nun das Ganze verbessern?
Die Antwort lautet PreparedStatement. Bei der initialisierung des Dialogs beschafft man sich ein PreparedStatement-Objekt
Diesem gibt man nicht den String
Code:
SELECT * FROM Kunden WHERE name='irgendwer'
sondern
Code:
SELECT * FROM Kunden WHERE name = ?

Das ? ist ein Platzhalter. Jetzt kann die Datenbank parsen, validieren, optimieren und den Zugriffsplan erstellen. Und das
nur einmal.
Anschliessend muss man bei einem klick nur die Parameter binden. Das geht mit einer der setXXX-Methoden.
Zum Beispiel.
Code:
preparedStement.setString(1, textFieldSearchString.getText());
damit wird der String des TextFields als erster Parameter gebunden. Das bedeutet, dass bei der Ausführung dieser
Parameter an die Stelle des ersten Fragezeichens gesetzt wird. Dann macht man einfach ein executeQuery.
Der Benutzer kann jetzt beliebig viele Suchanfragen stellen ohne das die Performance der Datenbank darunter leidet.

HINWEIS
Gib immer alle Ressourcen wieder frei, wenn du diese nicht mehr brauchst. Wie oben beschriebden, weißt du jetzt ja,
das du damit die Ressourcen auf der Datenbank wieder freigibst. Also nicht denken "Das macht der Garbage Collector schon".
Wann der das macht ist nicht klar. Deswegen solltest du die Datenbank nicht mit dem Verwalten von
Ressourcen aufhalten, die du sowieso nie mehr brauchst.
Also mach einfach ein close auf das Statement oder die jeweilige Ressource.

So jetzt könnte ich dir noch was über Transaktionen und Isolationslevel erzählen, aber dazu habe ich keine Lust mehr.
Such im Internet dort gibt es einiges.

Ich hoffe, dass ich ein wenig Klarheit in das Konzept bringen konnte, welches hinter JDBC steht. Vielleicht wird es
dem Einen oder Anderem hilfreich sein. :D
 

Reality

Top Contributor
Hi Rene! :shock:
Ich lerne JAVA in der Schule (Berufskolleg für Inofrmations- und Kommunikationstechnik) und bin gerade im ersten Jahr und da lernen wir das normalerweise noch (lange) nicht. Deswegen habe ich da noch ein paar Probleme, was das ganze angeht.
Deine Erklärung ist sehr informativ, danke für deine Mühe, jedoch wäre es mir lieber, wenn du mir als Anfänger einen konkreten Hinweis geben würdest. ;)
Danke. :)

Liebe Grüße
Reality
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
N package wird doppelt im exporer angezeigt Java Basics - Anfänger-Themen 2
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
J Fehler beim generieren von 4 Zufallszahlen Zahl doppelt ist eigentlich ausgeschlossen Java Basics - Anfänger-Themen 9
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8
T Löschen in doppelt verketteter Liste Java Basics - Anfänger-Themen 1
L Input/Output Println wird doppelt ausgeführt Java Basics - Anfänger-Themen 11
D Interface Frame doppelt durch Aufruf der GUI Klasse Java Basics - Anfänger-Themen 1
B BufferedReader gibt Datei-Inhalt doppelt aus Java Basics - Anfänger-Themen 3
M Liste Implementation, doppelt next() Java Basics - Anfänger-Themen 13
D Klassen Doppelt so viele Elemente in Arraylist ? Java Basics - Anfänger-Themen 4
B Doppelt Verkettete Liste - Ist alles gut so? Java Basics - Anfänger-Themen 3
Salo Datentypen "Doppelt" List(e) ("gesucht") Java Basics - Anfänger-Themen 6
L do-while-Schleife läuft doppelt, try catch fehler Java Basics - Anfänger-Themen 12
U Datentypen Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 13
J Methoden Doppelt verkettete Liste remove(Object) Java Basics - Anfänger-Themen 8
B OOP Über eine doppelt verkettete Liste iterieren Java Basics - Anfänger-Themen 4
L Doppelt verkettete Liste Java Basics - Anfänger-Themen 6
T Java Methode wird unerwünscht doppelt aufgerufen?! Java Basics - Anfänger-Themen 4
R doppelt verkettete Liste aus Arrays erstellen Java Basics - Anfänger-Themen 1
OnDemand Doppelt Werte CSV Java Basics - Anfänger-Themen 2
llabusch Verkette Listen - Einfach und Doppelt Java Basics - Anfänger-Themen 3
S Doppelt verkettete Liste Java Basics - Anfänger-Themen 3
N Erste Zeile bei BufferedReader doppelt lesen? Java Basics - Anfänger-Themen 2
E Erste Schritte Sortieren von Objekten in doppelt-verlinkter Liste Java Basics - Anfänger-Themen 9
G Doppelt Verkettete Liste Java Basics - Anfänger-Themen 2
A Doppelt Verkettete Liste Java Basics - Anfänger-Themen 16
E doppelt verkettete liste Java Basics - Anfänger-Themen 10
S Methoden Methode wird doppelt aufgerufen ... Java Basics - Anfänger-Themen 5
J Mehrere Zufallszahlen erzeugen, aber keine darf doppelt erzeugt werden - Wie? Java Basics - Anfänger-Themen 5
B Doppelt gekettete Listen Java Basics - Anfänger-Themen 4
E Datentypen Doppelt verkettete Liste Java Basics - Anfänger-Themen 10
P Einfügen in doppelt verkettete Liste Java Basics - Anfänger-Themen 7
S Queue als doppelt verkettete Liste Java Basics - Anfänger-Themen 2
N doppelt verkettete liste einfügen Java Basics - Anfänger-Themen 7
K Datentypen Einfach/Doppelt verkettete Liste Java Basics - Anfänger-Themen 4
W Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 2
T Klasse in Java für doppelt verkettete Listen Java Basics - Anfänger-Themen 4
G PropertyChangeListener empfängt Events doppelt Java Basics - Anfänger-Themen 5
G Doppelt verkettete, generische Liste Java Basics - Anfänger-Themen 11
L doppelt verkette Liste Java Basics - Anfänger-Themen 5
H Fenster doppelt gezeichnet. Java Basics - Anfänger-Themen 2
G Einfügen aus Zwischenablage - alles doppelt? Java Basics - Anfänger-Themen 2
G JFileChooser kommt doppelt Java Basics - Anfänger-Themen 3
D doppelt verkettete Liste Java Basics - Anfänger-Themen 16
S Doppelt Verkettete Liste Java Basics - Anfänger-Themen 7
N Nullpointerexception bei Doppelt verketteter Liste Java Basics - Anfänger-Themen 7
M Listen richtig doppelt verkettet? Java Basics - Anfänger-Themen 13
D Exceptions in doppelt verketteter Liste Java Basics - Anfänger-Themen 5
C verify() wird doppelt aufgerufen (JTable + InputVerifier) Java Basics - Anfänger-Themen 8
M Doppelt verkettete Liste Zeiger Vorgänger beim Einfügen Java Basics - Anfänger-Themen 2
J doppelt verkettete Liste Java Basics - Anfänger-Themen 5
L doppelt verkettete Liste Java Basics - Anfänger-Themen 6
H doppelt verkette liste Java Basics - Anfänger-Themen 2
L rückwärtsausgeben einer doppelt verketteten liste Java Basics - Anfänger-Themen 2
G JList und ListCellRenderer - Vector erscheint doppelt Java Basics - Anfänger-Themen 6
G JComboBox gibt SelectedItem immer doppelt aus Java Basics - Anfänger-Themen 4
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 12
B Doppelt verkettete Liste Java Basics - Anfänger-Themen 16
B Array doppelt Felder löschen Java Basics - Anfänger-Themen 27
M Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 2
R Datentyp Ring - zyklisch doppelt verkettete Liste - HILFE! Java Basics - Anfänger-Themen 12
H Doppelt verkettete Listen Java Basics - Anfänger-Themen 2
S doppelt verkettete Listen Java Basics - Anfänger-Themen 4
X Vererbung: Doppelt verkettete Listen Java Basics - Anfänger-Themen 16
R Zeilen aus datei lesen + doppelt gespeichert? Java Basics - Anfänger-Themen 3
R doppelt verkettete Liste Java Basics - Anfänger-Themen 8
F doppelt verkettete liste! Java Basics - Anfänger-Themen 8
R doppelt verkettete azyklische Liste Java Basics - Anfänger-Themen 2
G Trotz Abfrage immer noch Zahlen doppelt Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben