mute Geschrieben 7. Juni 2008 Geschrieben 7. Juni 2008 Hallo. Ich habe mir eine Access Datenbank erstellt, die ich füllen möchte... Ich habe dazu eine ganze Menge an Werten für einen Eintrag. Als ich das ganze nur mit Vorname und Nachname gemacht habe ging eigentlich alles ganz gut... nun habe ich es auf alle Daten erweitert und erhalte nur meine Exception java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntaxfehler in der INSERT INTO-Anweisung das ganze sieht bei mir im quellcode folgendermaßen aus: String anlegen = "INSERT INTO kunden (Nachname, Vorname, Strasse, Hausnr, Ort, PLZ, Vertragsnummer, Gesellschaft, Versicherungen, Vorlagedatum, Vertragsende, E-Mail, Telefon) VALUES ('" + nname.getText() + "','" + vname.getText() + "','" + strasse.getText() + "','" + hnr.getText() + "','" + ort.getText() + "','" + plz.getText() + "','" + vnummer.getText() + "','" + gschaft.getText() + "','" + vers.getText() + "','" + plz.getText() + "','" + plz.getText() + "','" + email.getText() + "','" + tel.getText() + "')"; System.out.println(anlegen); stmt.executeUpdate(anlegen); das System.out.println liefert mir INSERT INTO kunden (Nachname, Vorname, Strasse, Hausnr, Ort, PLZ, Vertragsnummer, Gesellschaft, Versicherungen, Vorlagedatum, Vertragsende, E-Mail, Telefon) VALUES ('Tester','Thomas','Teststraße','123a','Testort','0124','test-1234-te34','Testversicherung','TestKFZ-Haftpflicht, TestHausrat','0124','0124','testmail@muhkuh.de','01234567') ich werd langsam etwas kirre ^^ Die reihenfolge der Tabellenköpfe stimmt 100%, ebenso wie evtl. Tippfehler...habe extra alles mit copy&paste übernommen und mehrmals überprüft... Zitieren
danvan Geschrieben 7. Juni 2008 Geschrieben 7. Juni 2008 vor testhuasrat fehlt das erste Hochzeichen oder? ach nee, sorry,. Mh. finde den fehler auch nicht ... Zitieren
mute Geschrieben 7. Juni 2008 Autor Geschrieben 7. Juni 2008 ne das ist nicht der fehler, dass hab ich nru so ins label eingetragen wenn ich das ganze auf String anlegen = "INSERT INTO kunden (Nachname, Vorname) VALUES ('" + nname.getText() + "','" + vname.getText() + "')"; reduziere funktionierts....och menno :/ vielleicht noch zu erwähnen: alle daten kommen aus stink normalen labels und die felder in der access datenbank sind auch alle als Text formatiert... also eigentlich nichts besonderes zu beachten... Zitieren
mute Geschrieben 7. Juni 2008 Autor Geschrieben 7. Juni 2008 Problem gelöst: Ich habe nun nochmal alles von vorn geschrieben und immer eine Spalte mehr füllen lassen....man darf im spaltenkopf kein "-" schreiben, wie zb E-Mail.... das ganze einfach in Email geändert und es geht >_> Danke trotzdem! ^^ Zitieren
kingofbrain Geschrieben 8. Juni 2008 Geschrieben 8. Juni 2008 Servus, bitte schmeiß Dein Statement komplett in den Müll und schau Dir PreparedStatements an. Diese Fummelei mit Hochkommata und String-Verknüpfung ist ja furchtbar. Ein Statement für ein PreparedStatement sieht z.B. so aus: "SELECT name, vorname FROM Person WHERE id = ? Dann kannst Du für jedes Fragezeichen in Deinem Statement einen Wert setzen (typsicher). In diesem Fall z.B. setInt(1, 14). Dann wird für das erste Fragezeichen der Wert 14. gesetzt. Damit brauchst Du Dich um die Codierung der Variablen in Deinem Statement nicht kümmern. Strings werden korrekt umgewandelt, Zahltypen, Booleans usw. Peter Zitieren
geloescht_Newlukai Geschrieben 8. Juni 2008 Geschrieben 8. Juni 2008 Es sieht nicht nur furchtbar aus. Es ermöglicht auch Attacken mittels SQL-Injection. Zitieren
mute Geschrieben 9. Juni 2008 Autor Geschrieben 9. Juni 2008 hmm davon hab ich noch nix gehört aber grad wenns um sicherheit geht bin ich nat. voll dabei^^ aber in der form, wie du das eben schriebst ist es doch eine abfrage, ich will ja was speichern... find grad leider im netz nichts dazu, werd heut nachmttag nochma schaun (hab grad in vorlesung nich die zeit dafür^^) Zitieren
kingofbrain Geschrieben 9. Juni 2008 Geschrieben 9. Juni 2008 Servus, ob Abfrage oder INSERT / UPDATE / DELETE ist völlig egal. Auch bei der Datenmanipulation kannst Du ja für die variablen Teile Fragezeichen einsetzen. Peter Zitieren
mute Geschrieben 9. Juni 2008 Autor Geschrieben 9. Juni 2008 hmm ok ich werde das mal machen wenns programm fertig ist lieber mach ich erstmal alles funktionierend fertig bis zum abgabetermin...feintuning kann dann noch kommen habe aber ein anderes problem ich hab mir eine methode erstellt, die 2 strings mit der datenbank abgleichen soll hier mal der code public boolean login(final String[] logindata) { boolean korrekt=false; try { // Treiber laden. Class.forName(driverClass); // Verbindung aufbauen. myConnection = DriverManager.getConnection(url, user, password); Statement stmt = myConnection.createStatement(); //Datenabfrage // Einfügen von Daten in die Datenbank String query = "SELECT * FROM acc"; ResultSet rs = stmt.executeQuery(query); while (rs.next()) { System.out.println("***\n" + rs.getString("Login")); System.out.println(rs.getString("Passwort") + "\n***"); if ((rs.getString("Login") == logindata[0]) && (rs.getString("Passwort") == logindata[1])) { korrekt = true; } } rs.close(); } catch (Exception error) { System.out.println(error.toString()); } return(korrekt); } (die anbindungen sind global vorher schon getroffen in der klasse) alle daten kann ich problemlos korrekt ausgeben lassen nur in der if-schleife scheint es ein problem zu geben...denn an dieser stelle bricht es mit folgendem fehler ab: java.sql.SQLException: No data found bin am rumprobieren, aber irgendwie wills nich^^ Zitieren
mute Geschrieben 9. Juni 2008 Autor Geschrieben 9. Juni 2008 es muss ein fehler bei abfrage der if bedingung sein bloß ich weis nich so richtig wie ich es anders gestalten soll habs auch erfolglos mit logindata[0].equals(rs.getString("Login")) probiert... es sind ja auch beides string *bald verzweifel* Zitieren
kingofbrain Geschrieben 10. Juni 2008 Geschrieben 10. Juni 2008 Servus, das mit "ich mach jetzt erst mal fertig und optimier dann" wird nicht funktionieren. Du musst Dir die Zeit nehmen, oder es bleiben lassen. Zu Deinem Fehler. Debugge in das Programm rein und schau nach, was in den Feldern drinsteht. An Deiner Query gefällt mir nicht, dass Du nach "*" suchst, und dann über rs.getXY(Name) zugreifst. Woher weißt Du, dass in "*" Dein Name mit dabei ist? "SELECT name, password" und dann die entsprechenden get-Methoden sind hier besser. Peter Zitieren
Amstelchen Geschrieben 10. Juni 2008 Geschrieben 10. Juni 2008 die angeführte login-funktion ist äusserst unsauber. warum nicht einfach true/false durch die datenbank liefern lassen, ob die login-credentials korrekt sind. ein recordset ist unnötig und unperformant, du selektierst immerhin für einen login-check *ALLE* datensätze. weiters würde ich hier wie angemerkt mit preparedstatements arbeiten. s'Amstel Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.