# Problem mit INSERT INTO



## Der Programmierer (20. Jan 2007)

Hi leutz,
ich habn kleines Problem mit ner Access Datenbank. 



```
try{
				datenmenge = befehl.executeQuery("INSERT INTO Personen(Name, Alias, Größe, Rasse, Lieblingswaffe, Sternzeichen, Geburtsdatum, Beschreibung) VALUES(neue_person.name,neue_person.alias, neue_person.size, neue_person.race, neue_person.weapon, neue_person.star_sign, neue_person.date, neue_person.descripton);");

			}
			catch(Exception err)
			{
				err.printStackTrace();
			}
```

Der Compiler sagt mir dass er 8 Parameter erwartet aber er keine 8 bekäme!
Allerdings sind beides 8 Felder. 
(Alle neue_person Variabeln sind Strings!)

Das ist meine erste Clientanwendung also habt bitte etwas Nachsicht ;-)

Schonmal danke im vorraus für eure Hilfe 

Der Programmierer


----------



## Gast (20. Jan 2007)

das wundert mich jetzt das der compiler deine sqlstatements überprüft 

du darfst natürlich nicht z.B. neue_person.name als String in die Anfrage schreiben:

"VALUES("+neue_person.name+","+...


----------



## L-ectron-X (20. Jan 2007)

und das


> );");


kann auch nicht sein.


----------



## André Uhres (20. Jan 2007)

Bei MS Access ist das Semicolon wohl nicht nötig, 
aber einige Datenbankprogramme verlangen es am Ende jedes SQL Statements.


----------



## Der Programmierer (21. Jan 2007)

das mit dem Semikolon steht so in meinem Buch und wie soll ich sonst die Strings übergeben als als normale Strings halt?


----------



## André Uhres (21. Jan 2007)

Der Programmierer hat gesagt.:
			
		

> das mit dem Semikolon steht so in meinem Buch und
> wie soll ich sonst die Strings übergeben als als normale Strings halt?


Du musst Strings und Variablen mit + aneinanderketten. Siehe oben Beitrag von Gast.


----------



## Der Programmierer (21. Jan 2007)

So also?:


```
datenmenge = befehl.executeQuery("INSERT INTO Personen(Name, Alias, Größe, Rasse, Lieblingswaffe, Sternzeichen, Geburtsdatum, Beschreibung) VALUES("+neue_person.name+","+neue_person.alias+","+ neue_person.size+","+ neue_person.race+", "+neue_person.weapon+", "+neue_person.star_sign+","+ neue_person.date+","+ neue_person.descripton+");");
```


Denn seltsamerweiße gehts so nich


----------



## André Uhres (21. Jan 2007)

Der Programmierer hat gesagt.:
			
		

> ..Denn seltsamerweiße gehts so nich


Sehr informativ..


----------



## Der Programmierer (21. Jan 2007)

^^
Ich dachte ich hab bestimmt nen sehr offensichtlichen ehler gemacht.

Um genau zu sein sagt mir der COmpilier er würden 3 Parameter erwartet aber zu wenige übergeben!
Aber der gibt dauernd ne andere Zahl an erwartenden Parametern aus. Mal erwartet er 6 mal 2 und jetzt 3.


----------



## Roar (21. Jan 2007)

wenn du selber nicht mit den fehlermeldungen klarkommst, poste doch wenigstens was dein "compiler" dir sagt, dann kann dir auch jemand helfen.

im übrigen geht das so oder so nicht. mit executeQuery sendest du eine SELECT! und kein insert dafür gibts executeUpdate(


----------



## Der Programmierer (21. Jan 2007)

Ich hab jetzt executeUpdate benutzt und jetzt bekomm ich dieses Error:





Ich werde nicht ganz Schlau daraus.


```
datenmenge = befehl.executeUpdate("INSERT INTO Personen(Name, Alias, Größe, Rasse, Lieblingswaffe, Sternzeichen, Geburtsdatum, Beschreibung) VALUES("+neue_person.name+","+neue_person.alias+","+ neue_person.size+","+ neue_person.race+", "+neue_person.weapon+", "+neue_person.star_sign+","+ neue_person.date+","+ neue_person.descripton+")");
```


----------



## Guest (21. Jan 2007)

Schau dir die Beschreibung zu executeUpdate in der API-Doku an. Insbesondere den Rückgabetypen.


----------



## Der Programmierer (21. Jan 2007)

der Rückgabewert ist ein Integer denn ich momentan erstmal ignoriere da ich ihn nicht brauche

Also einfach so
				 befehl.executeUpdate("INSERT INTO Personen(Name, Alias, Größe, Rasse, Lieblingswaffe, Sternzeichen, Geburtsdatum, Beschreibung) VALUES("+neue_person.name+","+neue_person.alias+","+ neue_person.size+","+ neue_person.race+", "+neue_person.weapon+","+neue_person.star_sign+","+ neue_person.date+","+ neue_person.descripton+")"); 

Hilft mir aber trotzdem nicht ich bekomme immer noch Errors:





Bitte um weiter Hilfe und schon mal danke für eure Hilfe bisher
Der Programmierer


PS: Tut mir leid wenn ich mich etwas dumm anstelle!


----------



## Guest (21. Jan 2007)

Könnte daran liegen, dass zwei der Felder in neue_person null sind.
Verwenmde am besten PreparedStatment
So ungefähr (die Hilfsklasse DBUtil kannst du erweitern, wenn du noch andere Typen verwendest)
	
	
	
	





```
Connection con = null;
PreparedStatement stmt = null;
try
{
   con = ...
   stmt = con.prepareStatement(
      "INSERT INTO Personen(Name, Alias, Größe, Rasse, Lieblingswaffe, Sternzeichen, "
     +"Geburtsdatum, Beschreibung) VALUES(?, ?, ?, ?, ?, ?, ?, ?) "
   );

   DBUtil.setValue(1, stmt, neue_person.name);
   DBUtil.setValue(2, stmt, neue_person.alias);
   DBUtil.setValue(3, stmt, neue_person.size);
   DBUtil.setValue(4, stmt, neue_person.race);
   DBUtil.setValue(5, stmt, neue_person.weapon);
   DBUtil.setValue(6, stmt, neue_person.star_sign);
   DBUtil.setValue(7, stmt, neue_person.date);
   DBUtil.setValue(8, stmt, neue_person.descripton);

   if(stmt.executeUpdate() != 1)
   {
      Fehler
   }
}
catch(SQLException e)
{
  // Fehlerbehandlung
}
finally
{
   if(stmt != null)
   {
      try { stmt.close(); } catch(SQLException e) { /*Fehlerbehandlung*/ }
   }
   if(con != null)
   {
     try { con.close(); } catch(SQLException e) { /*Fehlerbehandlung*/ }
   }
}

-------------------------------

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

public final class DBUtil
{
   private DBUtil() {}

   public static String getString(ResultSet rs, String fieldName) throws SQLException
   {
      String stringValue = rs.getString(fieldName);
      return !rs.wasNull()? stringValue : null;
   }

   public static Boolean getBoolean(ResultSet rs, String fieldName) throws SQLException
   {
      boolean booleanValue = rs.getBoolean(fieldName);
      return !rs.wasNull()? Boolean.valueOf(booleanValue) : null;
   }

   public static Integer getInteger(ResultSet rs, String fieldName) throws SQLException
   {
      int intValue = rs.getInt(fieldName);
      return !rs.wasNull()? Integer.valueOf(intValue) : null;
   }

   public static Double getDouble(ResultSet rs, String fieldName) throws SQLException
   {
      double doubleValue = rs.getDouble(fieldName);
      return !rs.wasNull()? Double.valueOf(doubleValue) : null;
   }

   public static Float getFloat(ResultSet rs, String fieldName) throws SQLException
   {
      float floatValue = rs.getFloat(fieldName);
      return !rs.wasNull()? Float.valueOf(floatValue) : null;
   }

   public static java.util.Date getDate(ResultSet rs, String fieldName) throws SQLException
   {
      java.sql.Date dateValue = rs.getDate(fieldName);
      return !rs.wasNull()? new java.util.Date(dateValue.getTime()) : null;
   }

   public static void setValue(int index, PreparedStatement stmt, String value) throws SQLException
   {
      if( value != null )
         stmt.setString(index, value);
      else
         stmt.setNull(index, Types.VARCHAR);
   }

   public static void setValue(int index, PreparedStatement stmt, Boolean value) throws SQLException
   {
      if( value != null )
         stmt.setBoolean(index, value.booleanValue());
      else
         stmt.setNull(index, Types.BOOLEAN);
   }

   public static void setValue(int index, PreparedStatement stmt, boolean value) throws SQLException
   {
      setValue(index, stmt, Boolean.valueOf(value) );
   }

   public static void setValue(int index, PreparedStatement stmt, Integer value) throws SQLException
   {
      if( value != null )
         stmt.setInt(index, value.intValue());
      else
         stmt.setNull(index, Types.INTEGER);
   }

   public static void setValue(int index, PreparedStatement stmt, int value) throws SQLException
   {
      setValue(index, stmt, Integer.valueOf(value));
   }

   public static void setValue(int index, PreparedStatement stmt, Double value) throws SQLException
   {
      if( value != null )
         stmt.setDouble(index, value.doubleValue());
      else
         stmt.setNull(index, Types.DOUBLE);
   }

   public static void setValue(int index, PreparedStatement stmt, double value) throws SQLException
   {
      setValue(index, stmt, Double.valueOf(value));
   }

   public static void setValue(int index, PreparedStatement stmt, Float value) throws SQLException
   {
      if( value != null )
         stmt.setFloat(index, value.floatValue());
      else
         stmt.setNull(index, Types.FLOAT);
   }

   public static void setValue(int index, PreparedStatement stmt, float value) throws SQLException
   {
      setValue(index, stmt, Float.valueOf(value));
   }

   public static void setValue(int index, PreparedStatement stmt, java.util.Date value) throws SQLException
   {
      if( value != null )
         stmt.setDate(index, new java.sql.Date(value.getTime()));
      else
         stmt.setNull(index, Types.DATE);
   }

}
```


----------



## DP (21. Jan 2007)

string und date-werte werden mit hochkomma gesetzt. 


```
insert into tab (n1, s1) values(0, 'toll')
```

oder per preparedstatement mit setString(int i, String s);


----------



## DP (21. Jan 2007)

Anonymous hat gesagt.:
			
		

> ...



ich würde es noch komplizierter machen und die werte bitweise per morser in die tabelle schicken :autsch: 


```
pstmt = con.prepareStatement("INSERT INTO Personen(Name, Alias, Größe, Rasse, Lieblingswaffe, Sternzeichen, Geburtsdatum, Beschreibung) VALUES(?, ?, ?, ?, ?, ?, ?, ?)");

pstmt.setString(1, name);
pstmt.setString(2, alias);
.
.
.
.

pstmt.execute();
```

und feierabend.


----------



## Der Programmierer (22. Jan 2007)

Ähm vielen dank aber irgendwie klappt es immer noch nicht ganz!
Ich hab den Code genauso wie du gepostet hast. Natürlich die variabelnnamen angepasst aber er sagt:

"Operation muss eine aktualisierte Abfrage verwenden"

```
PreparedStatement pstmt = verbindung.prepareStatement("INSERT INTO Personen(Name, Alias, Größe, Rasse, Lieblingswaffe, Sternzeichen, Geburtsdatum, Beschreibung) VALUES(?,?,?,?,?,?,?,?)"); 
				pstmt.setString(1, neue_person.name);
				pstmt.setString(2, neue_person.alias); 
				pstmt.setString(3, neue_person.size);
				pstmt.setString(4, neue_person.race); 
				pstmt.setString(5, neue_person.weapon);
				pstmt.setString(6, neue_person.star_sign); 
				pstmt.setString(7, neue_person.date);
				pstmt.setString(8, neue_person.descripton);

				pstmt.execute();
```


----------



## Gast (22. Jan 2007)

pstmt.executeUpdate();


----------



## Der Programmierer (22. Jan 2007)

hab ich auch schon probiert! Es kommt dasselbe bei raus!


----------



## Der Programmierer (24. Jan 2007)

ich habs mal so getestet um auszuschließen, dasss es an den String liegt!


```
try{
            pstmt = verbindung.prepareStatement("INSERT INTO Personen(Name, Alias, Größe, Rasse, Lieblingswaffe, Sternzeichen, Geburtsdatum, Beschreibung) VALUES(?,?,?,?,?,?,?,?)");
            pstmt.setString(1, "TEST");
            pstmt.setString(2,"TEST");
            pstmt.setString(3, "TEST");
            pstmt.setString(4, "TEST");
            pstmt.setString(5, "TEST");
            pstmt.setString(6, "TEST");
            pstmt.setString(7, "TEST");
            pstmt.setString(8, "TEST");

            pstmt.executeUpdate();

        
      }
      catch(Exception err)
      {
        err.printStackTrace();
      }
```

Aber das klappt auch nicht. Da steht immer noch, dass eine aktualisierte Anfrage verwendet werden muss!
Kann mir niemand helfen?

Schonmal vielen dank im vorraus!


----------

