# Datensätze variabel hinzufügen



## Calimero (22. Mai 2007)

Hallo Leute!

Ich bin gerade dabei mich mit DB zu beschäftigen. Habe eine Tabelle angelegt und möchte nun über ein Java Programm neue Datensätze hinzufügen. Das ist soweit auch kein Problem, solange die Daten im Code festgelegt sind. Nur ich möchte, das die Werte über die Konsole eingegeben werden können. Hierzu habe ich entsprechende Variablen deklariert und diese dann in die SQL-Abfrage eingebaut. Es kommt dann zwar keine Fehlermeldung, die Datensätze werden aber auch nicht hinzugefügt.


```
package mysql;
import java.sql.*;
import java.io.*;
import java.util.*;

public class Bundesländer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	
Scanner sc = new Scanner(System.in);
		// Treiber laden
		
try{
	 Class.forName("com.mysql.jdbc.Driver");
	System.out.println("Treiber wurde erfolgreich geladen!");
}
catch (ClassNotFoundException e){
	System.out.println("Fehler beim Laden des JDBC-Treibers");
	return;
}

// Verbindung zur Datenbank aufbauen

	String url ="jdbc:mysql://127.0.0.1:8889/bund";
	String benutzername ="root";
	String passwort ="root";
	int p;
	String region;
	int zahl;
	

	Statement befehl  = null;
	Connection verbindung = null;
	
	try {
		verbindung = DriverManager.getConnection(url,benutzername,passwort);
		befehl = verbindung.createStatement();
		}
	catch (Exception e){
		System.err.println("Verbindung zu " + url + " konnte nicht hergestellt werden");
		}
	
// Datensätze hinzufügen
	
	while (true){
		System.out.println("Geben Sie die Position ein: ('0' für Ende)");
		p = sc.nextInt();
		if (p==0)
			break;
		System.out.println("Geben Sie das Land ein: ");
		region = sc.next();
		System.out.println("Geben Sie die Einwohnerzahl ein: ");
		zahl = sc.nextInt();
	
	try {
		verbindung.setReadOnly(false);
		int anz = befehl.executeUpdate("insert into land values (p, region, zahl);");
		verbindung.commit();
		System.out.println("Eingefügte Datensätze: " + anz);
		}
	
	catch (Exception e){	
		}
	
	}
// Daten auslesen
	
	try {
		ResultSet datenmenge;
		datenmenge = befehl.executeQuery("select * from land");
		
// Einzelne Datensätze ausgeben
		String land;
		int einw;
		System.out.println("");
		System.out.println("------------------------------------------");
		System.out.println("Bundesland          Einwohner");
		System.out.println("------------------------------------------");
		while(datenmenge.next()){
			land = datenmenge.getString("Land");
			einw = datenmenge.getInt("Einwohner (in Mio)");
			System.out.println(String.format("%1$-20s%2$-20s", land,einw));
		}
		verbindung.close();
	
	}
	catch (Exception e){
		e.printStackTrace();
	}
	}}
```

Also wie oben bereits erwähnt: mit
*int anz = befehl.executeUpdate("insert into land values (1, 'Umbrien', 7);");
*funktioniert das Ganze.
Aber mit mit Variablen, also mit
*int anz = befehl.executeUpdate("insert into land values (p, region, zahl);");*
hat es nicht geklappt.

Kann mir jemand von Euch sagen, wie ich Datensätze variabel über die Konsole in die DB einfügen kann, bzw. was ich am Code ändern muß?

Vielen Dank schon mal im Voraus!

Mit freundlichen Grüßen, Calimero!   :?:


----------



## nols (22. Mai 2007)

wie wäre es mit

```
int anz = befehl.executeUpdate("insert into land values (" + p +", " + region + ",  "+ zahl + ");")
```
Das sollte dann funktionieren, in deinem Beispiel übergibst du einen festen String in dem die Variablen nicht ersetzt werden.


----------



## kleiner_held (22. Mai 2007)

Du musst schon das Statement richtig zusammenbauen - wie soll Java wissen, dass das p in dem String deiner variable p entspricht? (wir sind hier doch nicht bei Perl 
Also:

```
String statement = "insert into land values ("+p+", '"+region+"', "+zahl=")"
```
Besser ist aber definitiv mit PreparedStatements zu arbeiten:

```
PreparedStatement preparedStatement = connection.prepareStatement("insert into land values (?, ?, ?)");
preparedStatement.setInt( 1, p); 
preparedStatement.setString( 2, region); 
preparedStatement.setInt( 3, zahl); 
preparedStatement.executeUpdate();
```


----------



## Calimero (22. Mai 2007)

Vielen herzlichen Dank für die raschen Antworten!
Hab´s gerade ausprobiert und mich über den Erfolg gefreut!


----------



## HoaX (22. Mai 2007)

```
try {
      verbindung.setReadOnly(false);
      int anz = befehl.executeUpdate("insert into land values (p, region, zahl);");
      verbindung.commit();
      System.out.println("Eingefügte Datensätze: " + anz);
      }
   
   catch (Exception e){   
      }
```

wenn du die geworfenen exceptions verschluckst wird klar kein fehler ausgegeben, auch wenn einer da war. ein e.printStackTrace() ist das mindeste was man beim exceptionhandling machen sollte.


----------

