SQLite Daten werden nicht in die Tabelle eingefügt

LuckyGuy

Mitglied
Hallo Community,

Ich arbeite an einem kleinen Projekt für die Schule und komme einfach nicht weiter!!!

Wenn ich ein Ticket buche/storniere läuft das Programm, es wird mir der neue Datensatz ausgegeben,
es wird auch bestätigt das ich das Ticket gebucht/storniert habe.
Nur wenn ich nun die Tabelle ist das gebuchte Ticket nicht vorhanden
bzw. das stornierte Ticket ist immer noch vorhanden.

Habt ihr eine Idee warum das ganze nicht funktioniert?




Java:
private void jButtonTicketBuchenActionPerformed(ActionEvent evt) 
	{
		try {			
			System.out.println("Film_ID: "+jPanelFilmListe.getFilmID());
			System.out.println("Preisklasse: "+getPreisklasse());
			PreparedStatement TicketBuchenStmt = Methoden.getSqLiteVerbindung().prepareStatement(
					"insert into Ticket values( " 
					+"'"+NeuerDatensatz()+"', "
					+"Current_Date, "
					+"Current_Date, "
					+"'"+getPreisklasse()+"', "
					+"'"+jPanelFilmListe.getFilmID()+"')");
			
			TicketBuchenStmt.executeUpdate();

			System.out.println("Ticket gebucht!");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private int NeuerDatensatz(){
		int ND = 0;
		try {

			ResultSet NeuerDatensatz;
			PreparedStatement NeuerDatensatzStmt= Methoden.getSqLiteVerbindung().prepareStatement(
					"select ID from Ticket " 
					+"where ID = (select max(ID) from Ticket)");
			NeuerDatensatz = NeuerDatensatzStmt.executeQuery();
			NeuerDatensatz.next();

			ND = NeuerDatensatz.getInt(1)+1;
			System.out.println("Neuer Datensatz: "+ND);

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return ND;
	}


Java:
private void jButtonStornoActionPerformed(ActionEvent evt) {
try {
	PreparedStatement TicketStornoStmt=Methoden.getSqLiteVerbindung().prepareStatement(
					"delete from Ticket "+
					"where ID = ?");
		TicketStornoStmt.setString(1, jTextFieldTicketNummer.getText());
			
		TicketStornoStmt.executeUpdate();
		System.out.println("Ticket storniert");
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
 
Ersma ein bisschen Kritik:
warum verwendest Du ein PreparedStatement, wenn Du keine Parameter verwendest? Dazu sind PreparedStatements da...

Es reicht "SELECT MAX(ID) AS ID FROM Ticket" ....

Nun zu Deinem Problem:
In der Storno- Aktion hast Du ja mit Parametern im Statement gearbeitet, leider falscher Typ:
Id ist doch numerisch, oder? Passt nicht zu String, oder? Ist 3 gleich Hugo?
Also musst Du für den Parameter auch einen numerischen Wert angeben...

Noch Dazu:
vielleicht musst Du eine Transaktion um deine Anweisung spannen oder die Connection auf AutoCommit setzen.
Das merkt man daran, dass man bei geöffneter Connection (=Programm läuft) wunderschön auf der Datenbank die Änderungen sehen kann, die nach dem Schliessen der Connection (=Programm beendet) auf einmal wieder rückgängig gemacht sind...
 
Vielen Dank für deine Kritik und Hilfe

Habe die Punkte überarbeitet und die Connection auf AutoCommit gestellt.
Hat aber leider nicht geholfen.

"Transaktion um deine Anweisung spannen" Kannst du mir erklären was damit gemeint ist?
 
Du musst deine Statements und deine Connection nach getaner Arbeit schließen, sonst müllst du dir den Speicher zu. Ausserdem ist es Ratsam einen ConnectionPool zu verwenden. PreparedStatements kannst du am einfachsten so erzeugen:
Java:
PreparedStatement stmt=connection.prepareStatement("INSERT INTO emp (ename,empno) VALUES(?,?)");
Und danach die Parameter an die ? setzten:
Java:
stmt.setString(1,"Hägar der Schreckliche");   //Position als Zahl, beginnt bei 1
stnt.setInt(2, 1234);

Deine neuerDatensatz() Funktion ist auch nicht optimal. Um einen fortlaufenden Schlüssel zu erstellen gibts das autoincrement Schlüsselwort in fast jeder Datenbank. SQLite Autoincrement
Das heisst, die DB fügt automatisch einen fortlaufenden Wert ein, wenn du keinen spezifizierst.
 
Vielen Dank für deine Hilfe
Dein Kommentar zu NeuerDatensatz() hat mich auf die erste Hälfte der Lösung gebracht.
TicketBuchen funktioniert jetzt.

Aber kannst du mir SQLite Autoincrement erklären?
Ich habe es getestet und hatte dann immer ein leeres Feld anstatt der nächst höheren Zahl.
 
Zur Zeit sieht das Statement so aus.
Wie muss das ganze den mit Autoincrement aussehen

Java:
PreparedStatement TicketBuchenStmt = Methoden.getSqLiteVerbindung().prepareStatement(
					"insert into Ticket values( " 
					+"(select max(ID)from Ticket)+1, "
					+"Current_Date, "
					+"Current_Date, "
					+"?, "
					+"?)");
			TicketBuchenStmt.setInt(1, getPreisklasse());
			TicketBuchenStmt.setInt(2, jPanelFilmListe.getFilmID());
			
			TicketBuchenStmt.executeUpdate();


Nach dem Muster habe ich es versucht

SQL:
insert into car(marke, farbe) values ("Audi","blau")
 
SQL:
CREATE TABLE auto(autoNr int AUTO_INCREMENT PRIMARY KEY, name varchar2(100));
INSERT INTO auto (name) VALUES ('AuWeh Polo');
 

Zurück
Oben