Java Datum in Datenbank einschreiben

xlShortylx

Cadet 4th Year
Registriert
Sep. 2012
Beiträge
103
Hallo.

Ich habe ein Problem mit dem einspeichern eines Datums in meine Datenbank.

Ich lese die daten per BufferedReader aus einer Textdatei und will es mithilfe von SimpleDateFormat abspeichern.

Das geht soweit alles wie es soll.

Nun will ich es aber in die Datenbank eintragen, doch ich habe in der Datenbank dann nur das Datum 0000-00-00.

Code:
try{
	stmt.execute("CREATE TABLE tennis (MNR_ID INT(3), Gewinn DOUBLE(5,2), Datum DATE, Platz INT(1), Grund VARCHAR(20))");
	}catch(SQLException e){}
						
	stmt.execute("DELETE FROM tennis");
						
	for(int i=0;i<30/*mnr.size()*/;i++){
		int Amnr = mnr.get(i);
		double Apreis = gewinn.get(i);
		Date Adatum = datum.get(i);
		int Tag = Adatum.getDate();
		int Monat = Adatum.getMonth()+1;
		int Jahr = Adatum.getYear();
		int Aplatz = platz.get(i);
		String Agrund = grund.get(i);
		System.out.println(Amnr+"  "+Apreis+"  "+Tag+"-"+Monat+"-"+Jahr+"  "+Aplatz+"  "+Agrund);
		stmt.execute("INSERT INTO tennis (MNR_ID, Gewinn, Datum, Platz, Grund) VALUES ("+Amnr+","+Apreis+","+Tag+"/"+Monat+"/"+(Jahr+1900)+","+Aplatz+",'"+Agrund+"');");
	}


Hoffe es kann mir einer helfen, ich habe es eben noch nie gemacht mit Datum deswegen habe ich keine Ahnung^^
 
Verwend am besten ein PreparedStatement. Da kannst ein java.sql.Date übergeben und brauchst keine Angst vor SQL-Injection haben.

btw Variablen-namen beginnin in Java laut Convention mit einem Kleinbuchstaben.
 
Ich würde eher mit PreparedStatement arbeiten.

Also so was in der Art:

Code:
sqlAbfrage = "INSERT INTO tennis (MNR_ID, Gewinn, Datum, Platz, Grund) VALUES (?, ?, ?, ?, ?)";

PreparedStatement pstmt = conn.prepareStatement(sqlAbfrage);

pstmt.setInt(1, mnr.get(i));
pstmt.setDouble(2, gewinn.get(i));
pstmt.setDate(3, new java.sql.Date(datum.get(i)));
pstmt.setInt(4, platz.get(i));
pstmt.setString(5, grund.get(i));

pstmt.executeUpdate();

pstmt.close();
pstmt = null;

wo "conn" das Connection-Objekt ist.

[EDIT]
Wenn es sehr viele Inserts sind, dann würde ich vorschlagen "pstmt" vor der Schleife zu initialisieren, in der Schleife "pstmt.executeUpdate()" mit "pstmt.addBatch()" zu ersetzen, und dann erst nach der Schleife die Inserts auf einmal mit "pstmt.executeBatch()" zu realisieren und danach "pstmt" mit "pstmt.close()" und "pstmt = null" zu schließen bzw. vernichten.
 
Zuletzt bearbeitet:
Danke für die Antwort.

Also nur dass ihr wisst, ich bin im ersten Jahr an einer Informatikschule und somit bin ich noch unerfahren in manchen Dingen.

Ich wollte das prepareStatement verwenden doch es funktioniert nicht so ganz.

Ich weiß, man kann einiges an meinem Code verbessern aber so in der Art sollen wir es machen.

Kann ich hier eigentlich den ganzen Quellcode posten? Dann könnte mir vielleicht einer weiterhelfen.
 
Die Fehlermeldung müsste uns weiterbringen.
 
Ja ich weiß nicht ob es so leicht geht.
Ich habe das Datum per java.util.Date gespeichert. Bis jetzt habe ich nicht mit java.sql.Date gemacht.
Es kommt der Fehler dass der Konstruktor für Date(Date) undefiniert ist.

Da ich zwei verschiedene Date drinnen habe finde ich es leichter wenn du dir mal das ganze anschauen könntest ^^
 
Schau dir immer die Java API an, wenn du solche Fehler bekommst.

In dem Fall sagt er dir, dass dieser Konstruktor undefiniert ist.
Du gehst also zum Eintrag Date (java.sql) in der Java API, und in der Tat, gibt's so'n Konstruktor nicht.
Der Konstruktor Date (long date) wird hier empfohlen.
Soll heißen, er erwartet einen long als Parameter.

Da deine get-Methode in dem Fall ein Date-Objekt (java.util) liefert, musst du es vorher in einen long umwandeln.
Dazu checkst du dein Eintrag Date (java.util) in der Java API, um zu wissen, wie das geht (oder ob das geht!! hh).
Du wirst dort die Methode getTime() finden, die einen long liefert.


Lösung also:
pstmt.setDate(3, new java.sql.Date(datum.get(i).getTime()));
 
Zuletzt bearbeitet:
Nice^^ Das mit Java API ist nett dass du es mir geschrieben hast. Habe es jetzt mit deiner Lösung probiert und es funktioniert, jetzt muss ich zwar noch schauen wieso er mir nur einen Eintrag in die Datenbank macht. Wie lang Programmierst du eigentlich schon Java?


Habe gerade gemerkt er schreibt nur den letzten Eintrag hinein. Ich guck mal wenn ich nix finde dann frag ich nochmal :D
 
Zuletzt bearbeitet:
2 Jahre :)
 
Am liebsten würd ich es einfach ohne Probleme hinbekommen können ^^ Einfach so wie einen deutschen Satz schreiben können.

Also ich komm nicht wirklich drauf, ich merke nur dass es vielleicht an dem pstmt.addBatch() in der Schleife und pstmt.executeUpdate() nach der Schleife liegen muss.
 
Es soll executeBatch heißen nach der Schleife aber ;)
 
Habe deinen letzten Beitrag noch nicht gelesen gehabt und auch gerade in deinem ersten Post den Fehler entdeckt^^ Danke trotzdem, find ich richtig nice dass es genug Leute gibt die auch mit etwas hilfreichem antworten. Thank You



Habe es gerade ausprobiert aber es funktioniert trotzdem noch nicht.


Code:
Connection con = null;
Statement stmt = null;
				
	try {
		Class.forName("com.mysql.jdbc.Driver");
	try {
		con = DriverManager.getConnection("jdbc:mysql://localhost:3306/java_uebung2","root","");
		stmt = con.createStatement();
		try{
			stmt.execute("CREATE TABLE tennis (MNR_ID INT(3), Gewinn DOUBLE(5,2), Datum DATE, Platz INT(1), Grund VARCHAR(20))");
		}catch(SQLException e){}
						
		stmt.execute("DELETE FROM tennis");
						
		PreparedStatement pstmt=null;
						
		for(int i=0;i<30/*mnr.size()*/;i++){
														
			String sqlAbfrage = "INSERT INTO tennis (MNR_ID, Gewinn, Datum, Platz, Grund) VALUES (?, ?, ?, ?, ?)";
						     
			pstmt = con.prepareStatement(sqlAbfrage);
						     
			pstmt.setInt(1, mnr.get(i));
			pstmt.setDouble(2, gewinn.get(i));
			pstmt.setDate(3, new java.sql.Date(datum.get(i).getTime())); 
			pstmt.setInt(4, platz.get(i));
			pstmt.setString(5, grund.get(i));
						     
			pstmt.addBatch();
							
		}
						
		pstmt.executeBatch();
						
		pstmt.close();
		pstmt = null;
						
		System.out.println("Erfolgreich in die Datenbank eingelesen!");
					    
	} catch ( SQLException e ){
		System.out.println(e);
	}

} catch (ClassNotFoundException e) {
	System.err.println("Klasse kann nicht gefunden werden!");
}finally{
	if ( stmt != null )
		try { stmt.close(); }
			catch ( SQLException e ) { /*ignore*/ }
	if ( con != null )
		try { con.close(); }
			catch ( SQLException e ) { /*ignore*/ }
}



Immer der letzte Eintrag wird nur übernommen.
 
Zuletzt bearbeitet:
String sqlAbfrage = "INSERT INTO tennis (MNR_ID, Gewinn, Datum, Platz, Grund) VALUES (?, ?, ?, ?, ?)";
pstmt = con.prepareStatement(sqlAbfrage);

müssen vor der Schleife sein, nicht drinne.

Und gern geschehen :)
 

Ähnliche Themen

Zurück
Oben