# delete aus datenbank, funktioniert nicht so richtig



## apfelkuchen (3. Apr 2005)

hallo, wir müssen die ID eingeben, und dann wird der Eintrag mit der ID gelöscht.

leider weiss ich nicht, wie wir das mit diesem executeUpdate machen sollen.

bitte um hilfe!!!



```
public static String deletedbTaxifahrer (String eingabe)
		{
			
			int i = Integer.valueOf(eingabe).intValue();
			int delete;
			
			
			if (i == 1) 
				{	
					
					System.out.print("Taxifahrer ID eingeben: ");
					
				}
				
			if (i == 2) 
				{
					
					System.out.print("Taxi ID eingeben: ");
					
				}
			
			BufferedReader myinput = new BufferedReader (new InputStreamReader(System.in));
			
					
			delete = Input.readInt();
			
			
			String host = "localhost";
 			String db = "taxiservice";
 			String Befehl = "SELECT * FROM `taxifahrer` ";
 		
 		try {
 			Class.forName("com.mysql.jdbc.Driver").newInstance();
 			Connection con = DriverManager.getConnection("jdbc:mysql://"+host+"/"+db,"root","root");

 		    Statement stmt = con.createStatement();
 		    String sql = "";
 		    switch(i)
 		    {
 		    	case 1:
 		    		
 		    		sql = "delete from taxifahrer where id = ";
 		    		
 		    		
 		    	break;
 		    		
 		    	case 2:
 		    	
 		    		sql = "delete from taxi where id = ";
 		    		
 		    		
 		    	break;
 		    }
 		    sql = sql + delete +";";
 		    
 		    
 		    println(sql);
 		    
 		    ResultSet results = stmt.executeUpdate(sql);
            while(results.next())
            {
                System.out.println();
                System.out.println("Vorname: " + results.getString("Vorname"));
                System.out.println("Nachname: " + results.getString("Nachname"));
                System.out.println("SVN: " + results.getString("SVN"));
            }
 			con.close();
 			
 		}
 		
 		catch (SQLException e) {
 			System.out.println(e);
 			System.out.println(e.getSQLState());
 			System.out.println(e.getErrorCode());
 		}
		
		catch (ClassNotFoundException e) {
			System.out.println(e);
		}	
		
		catch (Exception e)  {
			System.err.println("Ausnahme/Exception: " + e.getMessage());
			System.err.println("Ausnahme/Exception: " + e.getCause());
			
			}
		return Befehl;
		
		}
```


----------



## semi (3. Apr 2005)

Verwende PreparedStatement
	
	
	
	





```
Connection con = null;
PreparedStatement ps = null;
try {
  con = ...
  ps = con.prepareStatement("DELETE FROM taxifahrer WHERE id = ?");
  ps.setString(1, taxifahrerID);
  if(ps.executeUpdate() != 1) {
    //nix gelöscht
  }
  ...
}
catch(SQLException e) {
  logger.error(e);
  throw e;
}
finally {
  if(ps != null) 
    ps.close();
  if(con != null) 
    con.close();
}
```


----------



## apfelkuchen (3. Apr 2005)

ok, aber mein befehl ist ja variabel, sprich die id wird ja eingelesen und dann an den abzuschickenden sql befehl weitergegeben. wie soll ich das einbauen? 


nach dem 

```
System.out.print("Taxifahrer ID eingeben: ");
```

kommt ja ein bufferedreader usw. und ließt ein welche ID gelöscht gehört, und dann soll das weiter ans sql....


----------



## semi (3. Apr 2005)

PreparedStatement ist ja variabel. Schau Dir das Beispiel genauer an.

Die Löschanweisung ist variabel, erst mit "ps.setString(1, taxifahrerID)" sagst Du welcher Datensatz
gelöscht werden soll. _taxifahrerID_ ist dann eine Variable, die Du an die Löschmethode übergibst.
In dem PreparedStatement wird dann das "?" durch die gegebene ID ersetzt.
Voll automagisch. :wink:


----------



## apfelkuchen (3. Apr 2005)

ok ich hab das jetzt so probiert:


```
public static String deletedbTaxifahrer (String eingabe)
		{
			
			int i = Integer.valueOf(eingabe).intValue();
			int delete;
			
			
			if (i == 1) 
				{	
					
					System.out.print("Taxifahrer ID eingeben: ");
					
				}
				
			if (i == 2) 
				{
					
					System.out.print("Taxi ID eingeben: ");
					
				}
			
		    
			BufferedReader myinput = new BufferedReader (new InputStreamReader(System.in));
			
					
			delete = Input.readInt();
			
			
			String host = "localhost";
 			String db = "taxiservice";
 			String Befehl = "SELECT * FROM `taxifahrer` ";
 		
 		try 
 		{
 			Connection con = null; 
 			PreparedStatement ps = null; 
 			Class.forName("com.mysql.jdbc.Driver").newInstance();
 			con = DriverManager.getConnection("jdbc:mysql://"+host+"/"+db,"root","root");

 		    Statement stmt = con.createStatement();
 		    String sql = "";
 		    switch(i)
 		    {
 		    	case 1:
 		    		
 		    		sql = "delete from taxifahrer where id = ";
 		    		
 		    		
 		    	break;
 		    		
 		    	case 2:
 		    	
 		    		sql = "delete from taxi where id = ";
 		    		
 		    		
 		    	break;
 		    }
 		    sql = sql + delete +";";
 		    
 		    ps = con.prepareStatement(sql); 
		    ps.setString(1, delete); 
 		    
 		    println(sql);
 		    
 			
 		}
 		
 		catch(SQLException e) { 
		  logger.error(e); 
		  throw e; 
		} 
		finally { 
 		 if(ps != null) 
 		   ps.close(); 
 		 if(con != null) 
  		  con.close(); 
		return Befehl;
		}

		
	}
```

hat nicht ganz funktioniert, ausserdem hat er im finally das ps und das con nicht gefunden....


----------



## semi (3. Apr 2005)

Du kannst nicht einfach Beispielcode übernehmen, dazu noch fehlerhaft,
und erwarten, dass es auf Anhieb läuft.
Schnapp Dir ein Tutorial zu PreparedStatements und lese 'ne Weile.


----------



## apfelkuchen (4. Apr 2005)

leider komm ich nicht drauf was ich falsch gemacht habe. 

kann jemand rat geben?


----------



## semi (4. Apr 2005)

Du hast Connection ind PreparedStatement im try-Block definiert und versuchst außerhalb
der Blocks (in finally) darauf zuzugreifen.
Im SQL Code beim PreparedStatement hast Du das ? entfernt (Es ist ein Platzhalter für die ID).

Prepared Statements


----------



## apfelkuchen (4. Apr 2005)

ok danke, wir haben es hinbekommen dass er löscht. jetzt haben wir aber noch eine kleine frage zu dem thema:

wie können wir anzeigen ob wirklich was gelöscht wurde.

also, er soll eine rückmeldung ausgeben, wenn etwas gelöscht wurde.

bitte um hilfe, hier ist unser scode:


```
public static String deletedbTaxifahrer (String eingabe)
		{
			
			int i = Integer.valueOf(eingabe).intValue();
			int delete;
			
			
			if (i == 1) 
				{	
					
					System.out.print("Taxifahrer ID eingeben: ");
					
				}
				
			if (i == 2) 
				{
					
					System.out.print("Taxi ID eingeben: ");
					
				}
			
		    
			BufferedReader myinput = new BufferedReader (new InputStreamReader(System.in));
			
					
			delete = Input.readInt();
			
			
			String host = "localhost";
 			String db = "taxiservice";
 			String Befehl = "SELECT * FROM `taxifahrer` ";
 		
 		try 
 		{
 			Connection con = null; 
 			
 			Class.forName("com.mysql.jdbc.Driver");
 			con = DriverManager.getConnection("jdbc:mysql://"+host+"/"+db,"root","root");
			PreparedStatement pstmt = null;

 		    switch(i)
 		    {
 		    	case 1:
 		    		
 		    		pstmt = con.prepareStatement("delete from taxifahrer where id = ?");
 		    		
 		    	break;
 		    		
 		    	case 2:
 		    	
 		    		pstmt = con.prepareStatement("delete from taxi where id = ?");
 		    		
 		    	break;
 		    }
 		    
		    pstmt.setInt(1, delete);
            pstmt.executeUpdate();
            pstmt.close();
            con.close();
        }
        catch (SQLException e) {}
        catch (ClassNotFoundException e) {}
 		    
 	
return db;
		
	}
```


----------



## semi (5. Apr 2005)

Und Du bist sicher, Du hast das hier gelesen?


----------



## apfelkuchen (6. Apr 2005)

danke semi.. habs hinbekommen...


----------

