Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Problem mit DB

Empfohlene Antworten

Veröffentlicht

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...

vor testhuasrat fehlt das erste Hochzeichen :)

oder?

ach nee, sorry,. Mh. finde den fehler auch nicht ...

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...

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! ^^

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

Es sieht nicht nur furchtbar aus. Es ermöglicht auch Attacken mittels SQL-Injection.

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^^)

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

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^^

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*

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.