# MySQL Dump



## Aldimann (2. Aug 2010)

Hallo zusammen,

ich hab ein SQL Dump der mir im Prinzip nur ein Datenbankmodell erstellen soll, also nur die Tables anlegen mit ihren Attributen etc.

Die Dumps wurden einmal in PhpMyAdmin erstellt und um dort Fehler auszuschließen auch nochmal mit Squirell SQL. In beiden Situationen meckert er über fehler in der Syntax obwohl sich die Scripte in den beiden Programmen problemlos wieder einspielen lassen.

Danach habe ich nur einen Teil des Scripts ausführen lassen, das hat Java ohne Probleme gemacht, allerdings wird in PhpMyAdmin und Squriell SQL der Table nicht angezeigt. Führe ich das ganze in Java nochmal aus, meckert er das der Table schon da ist. Host und Tabelle passen eigentlich.

Könnte das Problem evtl. daran liegen, dass ich executeUpdate ausführe und in der JavaDoc nur steht das damit nur INSERT, UPDATE oder DELETE geht?

Nochmal zur vorgehensweise (Das auslesen der SQL-Datei und zwischenspeichern in einen StringBuilder):


```
File file = new File(filePath);
                FileInputStream fis = new FileInputStream(file);
		InputStreamReader isr = new InputStreamReader(fis);
		
		BufferedReader br = new BufferedReader(isr);
		
		StringBuilder query = new StringBuilder();
		String line = "";
			while ((line = br.readLine())!= null) {
				query.append(line);
				query.append("\n");
			}
// Closen der br, isr, fis etc.

        Connection jdbcConnection;
        Statement stmnt = null;

            jdbcConnection = DriverManager.getConnection(
                    "jdbc:mysql://"+hostname+"/mysql?useUnicode=true&amp;characterEncoding=UTF-8&sessionVariables=FOREIGN_KEY_CHECKS=0", username,
                    password);
            stmnt = jdbcConnection.createStatement();
            stmnt.executeUpdate("create database if not exists "+dbname);
            jdbcConnection = DriverManager.getConnection(
                    "jdbc:mysql://"+hostname+"/"+dbname+"?useUnicode=true&amp;characterEncoding=UTF-8&sessionVariables=FOREIGN_KEY_CHECKS=0", username,
                    password);
	stmnt = jdbcConnection.createStatement();
            stmnt.execute(query.toString());
            
            stmnt.close();
```

Exceptions etc. hab ich mal ausgebaut.


----------



## Eldorado (2. Aug 2010)

Ich gehe mal davon aus das du weiter oben den Treiber lädtst. Wenn du schon vermutest, dass es an executeUpdate liegt, warum machst du es dann nicht mit execute. Ich hab hier mal ein Beispiel, was ich in einem meiner Programme hatte und was dort funktioniert hat:

```
try {
      Class.forName("com.mysql.jdbc.Driver");
      Connection c = DriverManager.getConnection("jdbc:mysql://" + serveradresse, username, password);
       Statement st = c.createStatement();
       st.execute("CREATE SCHEMA IF NOT EXISTS `" + datenbankname + "` ;");
       st.close();
       c.close();
} catch (ClassNotFoundException ex) {
} catch (SQLException ex) {
}
```


----------



## Aldimann (2. Aug 2010)

Also ein Problem hab ich gefunden.

Nachdem die Connection geändert wurde hab habe ich für stmnt 
	
	
	
	





```
jdbcConnection.createStatement();
```
 nicht nochmal aufgerufen.

Habe ich jetzt im Code und oben ausgebessert.

Trotzdem bleibt das Problem, dass ich das Script nicht ausführen kann. Habe jetzt wie Eldorado gesagt hat, einfach mal execute und executeUpdate ausprobiert. Leider ohne Erfolg


----------



## Eldorado (2. Aug 2010)

Oft ein Fehler: Die Hochkommata(oder wie man diese Striche nennt ) vor und hinter dem Datenbank-Namen fehlen. Kopiere dir bitte generell mal meinen Code und probiere es mit dem, ob er da auch mekkert. Dann können wir das vllt ein bisschen eingrenzen.Aber probier erst Punkt 1..


----------



## Aldimann (2. Aug 2010)

Also habe gerade nochmal mit jemandem drüber gesprochen.

Dabei ist rausgekommen, dass sehr wahrscheinlich das Problem darin besteht, dass ich mehrere Create Statements hintereinander (in einem String) ausführen möchte.

Diese These wurde verstärkt dadurch, dass die Statements sich alleine ausführen lassen nur bei mehreren geht es nicht.

Ist es also überhaupt möglich diese Statements zusammen auszuführen oder muss ich das ganze splitten? :/


Vielen Dank schonmal!


----------



## Eldorado (2. Aug 2010)

Aber dann müsste ja wenigstens die Datenbank erstellt werden, da du da ja nur einen einzelnen Befehl ausführst, Zu Thema ausführen von mehreren SQL-Befehlen: Mach doch einfach ein String-Array in dem du deine Befehle hast und iteriere dann drüber:

```
for ( int i = 0; i < befehlsArray.length; i ++ ) {
      stmnt.execute(befehlsArray[i]);
}
stmnt.close
```


----------



## Aldimann (2. Aug 2010)

Oh sorry, dass hab ich vergessen zu erwähnen!

Die DB erstellt er ohne Probleme, das was danach kommt funktioniert leider nicht.

Deine Lösung ist soweit gut, Problem ist aber, dass in meinem Fall alle Statements in einer File stehen die ich auslese.

Das heißt um einzeln über diese Dinger laufen zu können muss ich erst wieder alles splitten und wenn es noch irgendwie anders geht, würde ich das gern vermeiden.


----------



## Eldorado (2. Aug 2010)

Steht jeder Befehl in einer Zeile?


----------



## Eldorado (2. Aug 2010)

Ich habe mir grade nochmal angeschaut, wo es ja so aussieht, dass 1 Zeile = 1 Befehl ist. Dann musst du dein Programm eig nur so ändern und ergänzen:

```
Arraylist<String> befehle = new Arraylist<String>();//ergänzen
while ((line = br.readLine())!= null) {//ändern
                befehle.add(line);
}
//und dann unten:
for(String befehl : befehle){
  stmnt.execute(befehl);
}
stmnt.close
```
Code ist ungetestet und ohne IDE geschrieben, von daher garantiere ich für nichts. Aber ich denke es sollte dir eine Idee liefern wie du es lösen könntest.


----------



## Aldimann (2. Aug 2010)

Ne das war leider nicht der fall.

Ich hab jetzt einfach so gelöst.


```
String[] queries = query.toString().split(";");
```

Jedes create Statement wurde bei mir mit einem ; beendet daher das .

Dann bin ich per for-schleife über alle Arrayteile gelaufen und hab sie ausgeführt und das letzte Element ausgelassen, denn das letzte Element ist einfach n leerer String.

Vielen Dank für deine Hilfe!


----------



## Eldorado (2. Aug 2010)

Kein Problem!


----------

