# in eine Tabelle mit mySQL eine Zeile hinzufügen



## Guest (29. Jun 2006)

Hallo,

ich kann auf eine Tabelle zugreifen.
Auslesen klappt problemlos, indem ich ein Statement erzeuge und dann mit einem ResultSet die Daten auslese.

Wenn ich aber eine Zeile hinzufügen will, wie mache ich das?
Wenn ich das INSERT usw in ein ResultSet schreibe gibt es einen Fehler (ich nehm an weil es ja auch ein *Result*Set ist).
Aber wie kann ich dann die Daten in die Tabelle schreiben?
Brauche ich dafür überhaupt ein Statement?
Wie gehe ich genau vor?

Und folgendes:

```
INSERT INTO tabelle(Spalte1, Spalte2, Spalte3) VALUES(wert1, wert2, wert3);
```
wert1 und wert2 sind Variablen, die einen String enthalten, wert3 enthält einen double.
Kann ich Variablen überhaupt hineinschreiben?
(Die Tabelle erwartet schon String, String, double)

Wäre super, wenn ihr mir helfen könntet!


----------



## Caffè Latte (29. Jun 2006)

Hi,

statt "executeQuery()" musst du "executeUpdate()" bei INSERT, UPDATE und DELETE nutzen.

Hoffe es hilft


----------



## realbora (29. Jun 2006)

Hallo,

Für den insert benötigst du eigentlich kein ResultSet.
Der Code könnte dann in etwa so aussehen:


```
connection=DriverManager.getConnection(db_path,"root","");
query=connection.createStatement();
query.executeUpdate("insert into tab_name(spalte1,spalte2,spalte3)values('','"+var_name+"','')");
```


Vielleicht hilft dir das.


----------



## Guest (29. Jun 2006)

realbora hat gesagt.:
			
		

> Hallo,
> 
> Für den insert benötigst du eigentlich kein ResultSet.
> Der Code könnte dann in etwa so aussehen:
> ...


Vielen Dank für eure Hilfe erstmal!

Mein Problem ist jetzt, dass ich eine Fehlermeldung erhalte, und zwar: Data truncation: Data truncated for column 'spalte3' at row 1.
 :bahnhof: 

Jedoch stehen in dieser Spalte sicher Strings (hab selbre welche ausgelesen) und ich will auch einen String hinschicken.

Was mach ich noch falsch?


----------



## Guest (29. Jun 2006)

tut mir leid, dass ich den thread nochmal hochzieh.
hat denn keiner einen tip zu diesem problem?
ich häng hier dran gerade und komm nicht weiter.


----------



## realbora (29. Jun 2006)

Doch, ich hab einen!

Bei dem Datenbankpfad setze doch einfach mal hinter dem Namen der Datenbank, mit der du dich verbindest das hier "?jdbcCompliantTruncation=false"!

Dann funzt das auch!


----------



## Guest (29. Jun 2006)

Meinst du mit Datenbankpfad diese Zeile, in der ich das INSERT schreibe, oder allgemein, wenn ich die Verbindung aufbau?

Und kannst du vielleicht nochmal schnell erklären, wie ich die Variablen reinschreiben muss, da sind etwas viele ' und "


----------



## realbora (29. Jun 2006)

In der Zeile, wo du den Datenbankserver als String einträgst.
Sieht in etwa so aus:
String db_path="jdbc:mysql://localhost/db?jdbcCompliantTruncation=false";


----------



## realbora (29. Jun 2006)

Ich gehe auch mal davon aus, dass du einen mysql-db-server unter Version 4.2 hast!
Dann kannst du auch ne neuere Version installieren und der Fehler müsste weg sein!


----------



## Guest (29. Jun 2006)

Ja, 4.1.19 läuft auf dem Server.
Allerdings ist das nicht meiner und ich darf da nichts ändern.

Gibts noch eine andere Lösungsmöglichkeit?


----------



## realbora (29. Jun 2006)

Wenn das mit dem "?jdbcCompliantTruncation=false" nicht funktioniert weiss ich leider auch nicht weiter.
Hast du das denn schon mal ausprobiert?


----------



## Guest (29. Jun 2006)

Ja hab ich, dann kommt der Fehler zwar nicht mehr, aber an der Tabelle tut sich auch nichts.

Kannst du mir bitte nochmal ein Beispiel geben, wie ich die Variablen im INSERT Statement benutze?

Das würde mir sicher auch etwas weiterhelfen.


----------



## realbora (29. Jun 2006)

executeUpdate("insert into rechnung(id,nummer,kunden_nr)values('','"+reNr+"','1')");


In dieser Tabelle wird der Wert der Variablen "reNr" in die zweite Spalte geschrieben.
Die erste Spalte ist ein Auto_Increment-Wert und in der letzten Spalte wird einfach nur eine "1" in geschrieben.
Vielleicht liegt dein Problem auch in den Datentypen der einzelnen Spalten.
Ein Versuch wäre es wert, wenn du alle Datentypen auch "char" setzt, dann fügt mysql jeden Wert als String ein!
Das könnte zumindest für die Fehlersuche helfen.


----------



## Guest (29. Jun 2006)

Hab grade bemerkt, dass wenn ich für den double-Wert eine Zahl eingebe ( '10'), dann funktioniert das ganze.
Als Variable ('doubleWert') krieg ich allerdings immer noch den Fehler.


----------



## realbora (29. Jun 2006)

Da du die query als String übergibst, ist das klar, dass mysql mit dem String "doubleWert" nichts anfangen kann, weil das ja eigentlich ne zahl sein soll.
Deswegen musst du den Query-String "unterbrechen" und darin die Variable schreiben und das ganze dann wieder mit dem String-Verknüpfungs-Operator + verbinden.
deine Values müssen dann irgendwie so aussehen: 

```
values('"+doubleWert+"','1','"+hierNeAndereVariable+"','2');
```

Hier siehts du bestimmt den Unterschied!
Die Werte 1 und 2 sind statische Zahlenwerte, wobei doubleWert und hierNeAndereVariable die Variablen des Programms sind!

Ich hoffe, dass dich das jetzt zum Erfolg führt.[/code]


----------



## Guest (29. Jun 2006)

Vielen Dank, jetzt hab ich es hinbekommen!


----------



## realbora (29. Jun 2006)

kein problem.
büdde


----------



## Caffè Latte (1. Jul 2006)

Hi,

mit prepared Statements hat man solche Probleme nicht. Deshalb hier nochmals explizit der Hinweis darauf. 


```
// Prepare a statement to insert a record
        String sql = "INSERT INTO my_table("
            + "col_boolean,"
            + "col_byte,"
            + "col_short,"
            + "col_int,"
            + "col_long,"
            + "col_float,"
            + "col_double,"
            + "col_bigdecimal,"
            + "col_string,"
            + "col_date,"
            + "col_time,"
            + "col_timestamp) "
            + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
        PreparedStatement pstmt = connection.prepareStatement(sql);
    
        // Set the values
        pstmt.setBoolean(1, true);
        pstmt.setByte(2, (byte)123);
        pstmt.setShort(3, (short)123);
        pstmt.setInt(4, 123);
        pstmt.setLong(5, 123L);
        pstmt.setFloat(6, 1.23F);
        pstmt.setDouble(7, 1.23D);
        pstmt.setBigDecimal(8, new BigDecimal(1.23));
        pstmt.setString(9, "a string");
        pstmt.setDate(10, new java.sql.Date(System.currentTimeMillis()));
        pstmt.setTime(11, new Time(System.currentTimeMillis()));
        pstmt.setTimestamp(12, new Timestamp(System.currentTimeMillis()));
```

Hoffe es hilft ...


----------

