SQL in einer Schleife

mroemi

Mitglied
Java:
	           con = DriverManager.getConnection("jdbc:jpmdbc:http://www.xxx.de:80/jpmdbc.php?xxxx", connProperties);
	           
	           try {
	       		BufferedReader in = new BufferedReader(new FileReader("test.txt"));
	       		String zeile = null;

	            Statement statement = con.createStatement();
	            //zeile = "insert into `mr_bier2` (`id` ,`brauerei` ,`bezeichnung` ,`zusatz` ,`web` ,`sponsor` ,`region` ,`barcode` ,`getrunken`, `art`, `alc`, `vorrat`, `jahr`) values ('1197', 'Alsfelder', 'Bez', 'Zusatz', 'alsfelder.de', '', '0', '12345','0', 'Sonstiges', '0.00','1','2013')";
	            //statement.executeUpdate(zeile);
		       		while ((zeile = in.readLine()) != null) {
		       			System.out.println("Gelesene Zeile: " + zeile);

		       			zeile.replaceAll("\\n", "");
		       			zeile.replaceAll("\\r", "");
		       			statement.executeUpdate(zeile);
		       		}
		       	} catch (IOException e) {
		       		e.printStackTrace();
		       	}

Ich habe in einem File mehrere SQL-Anweisungen gesammelt und möchte diese nun einmal durchlaufen und an die Datenbank übergeben.
Wenn ich den gleichen SQL-String einzeln übergebe, funzt alles.
Lese ich aber den String erst aus und will Ihn dann übergeben, bekomme ich gesagt das ich einen Fehler in meinem Statement habe.
Ich habe den Zeilenumbruch im verdacht, bekomme es aber nicht gelöst.

Hat jemand eine Idee?

Danke

Römi
 
Nun, ich würde zunächst
Java:
boolean execute(String sql)
ausführen, da es ein insert ist und somit kein Update.
Zweitens würde ich PreparedStatements verwenden, da genau dafür wurden diese ja entwickelt. So kann die DB einmal den SQL-Befehl vorbereiten (intern kompilieren) und dann mit verschiedenen Parameter-Werten immer wieder ausführen.
Java:
		String sql = "insert into mr_bier2 (id ,brauerei ,bezeichnung ,zusatz ,web ,sponsor ,region ,barcode ,getrunken,art,alc,vorrat,jahr) "
				+ "values (?, ?, ?, ?, ?, ?, ?, ?,?, ?, ?,?,?)";
		Connection con =...;
			PreparedStatement prepareStatement = con.prepareStatement(sql);
			prepareStatement.setString(1, "1197");
			prepareStatement.setString(2, "Alsfelder");
			//... Weitere Attribute
			prepareStatement.execute();
Und zum Schluss würde ich das Datenmodell prüfen, da alle Atribute Strings zu sein scheinen, und das macht mir bei einigen keinen Sinn.
 
Zuletzt bearbeitet:
Oki, am Datenmodell muss ich noch schrauben ... keine Frage.

Aber ... im File stehen nicht nur insert, sondern auch update und delete.
Und ... das Ziel ist eine Datenbank im Web.
ich muss mal checken ob jpmdbc mit deinem Vorschlag zurecht kommt :reflect:

Ich sage Bescheid.

Danke

Römi
 
Zuletzt bearbeitet:
Das mit dem PreparedStatements hat nicht gefunzt.
Dafür aber habe ich daraus mein Vorgehen ableiten können und das klappt nun.

Danke!!
 
Erst einmal schön, das es nun klappt.

Aber...
Das mit dem PreparedStatements hat nicht gefunzt.
Das ist natürlich keine sinnvolle Beschreibung. Stürzt das Programm ab, gibt es eine Exception bei Ausführung oder kompiliert etwas nicht, oder, oder...

Also, wenn du hier noch Unterstützung benötigst, musst du genauer beschreiben, was nicht funzt😉

Eigentlich werden PreparedStatements häufig eingesetzt, zumal diese immun gegen SQL-Injection-Angriffe sind. Ich finde sie auch um Welten lesbarer als das Zusammenstückeln von String-Teilen zu einem gesamten SQL-Befehl.

PS: Es gibt auch den Danke-Button im Forum falls ein Beitrag für dich sinnvoll war:idea:
 
Zuletzt bearbeitet:
Sodele, mal mehr dazu. Ich verwende jpmdbc und der schleust mein SQL per PHP in die Web-DB.
Damit erzähle ich vermutlich nichts neues.

Soweit ich gelesen habe, kann man aber nicht wirklich alles drüber schicken. Für größere Mengen an Daten ist das ganze auch irgendwo zu langsam. Etwas was lokal funktioniert, wird in Verbindung mit der Web-DB nicht vollständig angezeigt/abgearbeitet.

Daher habe ich nun meine DB auch lokal und schreibe meine Änderungen in einem File mit.
Habe ich fertig 😉, vollziehe ich die Statements in der Web-DB nach und gut ist.

Dazu lese ich den File zeilenweise aus, baue das Statement und schicke es ab.
Da es dabei ständig zu Fehlermeldungen und Abbrüche gekommen ist, habe ich nun zwischen den einzelnen Statements ein klitzekleines Wait eingebaut. Nun klappt alles wie gewollt.

Vor SQL-Injection-Angriffe fürchte ich mich nicht allzu sehr ... es ist erst mal nur eine private Spielerei.
Wenn erst das ganze Java-Gedöns funzt wie gewünscht, ich es einigermaßen verstanden habe und der Code auch mal vorgezeigt werden kann, dann kümmere ich mich um das SQL.


"Danke" klicke ich natürlich gerne.
 
Daher habe ich nun meine DB auch lokal
Das finde ich sehr gut!

Da es dabei ständig zu Fehlermeldungen und Abbrüche gekommen ist, habe ich nun zwischen den einzelnen Statements ein klitzekleines Wait eingebaut.
Das finde ich nicht so gut😉

Normal sollte es möglich sein, einer DB mehrere tausend Befehle pro Sekunde zu schicken und es ist Aufgabe der DB diese entsprechend abzuarbeiten (vielleicht wird die DB bei hoher Last langsamer sollte aber definitiv NICHT zu Fehlern führen).

Es ist definitiv falsch und zeigt ein Problem, wenn sich ein DB-Client (dein Programm) um Timing-Dinge kümmern muss. Das ist ja überhaupt nicht testbar, wenn da mehrere Tausend Clients gleichzeitig mit der DB arbeiten wollen:shock:

Ich hoffe, alles dies tust du auf deiner lokalen Datenbank zum Test?

PS:Ich verwende häufig H2 oder Derby als lokale DB.
 
Zuletzt bearbeitet:
In diese DB schreibt nur EINER ... :hihi:

Und jpmdbc spricht eine php-Seite an um das Statement abzusetzen und die Antwort zurückzugeben.
Mir ist z.Z. keine andere Variante bekannt. Mein Web-Space ist nun mal 08/15 und die Web-MySQL für den Zugriff von außen gesperrt.

Lokal (und ich teste alles lokal) habe ich ebenfalls eine MySQL am Start.
 

Neue Themen


Zurück
Oben