# SQL-Befehle werden manchmal nicht komplett übermittelt



## MrQ (21. Jun 2006)

Hallo erstmal,

ich habe folgendes Problem:
in einer MySQL-Datenbank werden Messwerte mit Zeit, einer Modul-ID und Kanal-ID eingetragen. Das klappt eigentlich auch prima, nur manchmal kommt der SQL-Befehl nur Bruchstückhaft bei der datenbank an.

Es kommen immer alle Werte der letzten 15 Minuten von mehereren Kanälen an, die auch Nullen enthalten. Um keine Nullwerte abzuspeichern, wird der gesamte String ein wenig kompliziert zusammen gebaut. Wie gesagt, das funktioniert auch alles
Folgendermaßen wird der SQL-Befehl zusammengebaut: 


```
String sql ="INSERT INTO "+anlagendaten.datentabelle+" (zeit,mid,kid,wert) VALUES ";

[...]

if (wert != 0) {
	sql=sql+"('"+time+"',"+mid+","+kid+","+wert+")";
}
if ((h==(((int)(15/anlagendaten.speicherintervall))-1)) && (i==(anlagendaten.kanalanzahl-1))) {
    if (wert==0){
        index = sql.lastIndexOf( ',');
        sql= sql.substring(0, index);
    }
    sql=sql+";";
}
else {
    if (wert != 0){
        sql=sql+",";
    }	
}
tmpZaehler++;
```

Die Daten werden dann ganz normal eingetragen:


```
try {
      //System.out.println("Verbinde mit: logdata"+ServerTools.getYear());
       Connection cjdbc2 = DatabaseTools.connectDatabase("logdata"+ServerTools.getYear());
	PreparedStatement pstmt2 = cjdbc2.prepareStatement(sql);
	pstmt2.execute();
	cjdbc.close();
	cjdbc2.close();
	//System.out.println("Dateneintrag fertig");
} catch (Exception sqlex) {
	ServerDatenWriteLogger.error("Fehler: Anlage: "+anlagendaten.seriennummer);
	ServerDatenWriteLogger.error("Datenbankfehler: " + sqlex.getMessage());
	sqlex.printStackTrace();
}
```
In der MySQL-Logdatei sieht das ganze dann auch so aus:


> 69560 Prepare     [1] INSERT INTO t7 (zeit,mid,kid,wert) VALUES ('06.06.21 07:45',11,54,280),('06.06.21 07:45',11,55,275),('06.06.21 07:45',11,56,285),('06.06.21 07:45',11,57,290),('06.06.21 07:45',11,58,285),('06.06.21 07:45',11,59,295),('06.06.21 07:45',11,60,285),('06.06.21 07:45',11,61,270),('06.06.21 07:45',11,62,305),('06.06.21 07:45',11,63,265),('06.06.21 07:45',11,404,459),('06.06.21 07:45',11,405,-96),('06.06.21 07:45',12,64,250),('06.06.21 07:45',12,65,255),('06.06.21 07:45',12,66,255),('06.06.21 07:45',12,67,255),('06.06.21 07:45',12,68,260),('06.06.21 07:45',12,69,220),('06.06.21 07:45',12,70,245),('06.06.21 07:45',12,71,245),('06.06.21 07:45',12,72,250),('06.06.21 07:45',12,73,260);
> 69560 Execute     [1] INSERT INTO t7 (zeit,mid,kid,wert) VALUES ('06.06.21 07:45',11,54,280),('06.06.21 07:45',11,55,275),('06.06.21 07:45',11,56,285),('06.06.21 07:45',11,57,290),('06.06.21 07:45',11,58,285),('06.06.21 07:45',11,59,295),('06.06.21 07:45',11,60,285),('06.06.21 07:45',11,61,270),('06.06.21 07:45',11,62,305),('06.06.21 07:45',11,63,265),('06.06.21 07:45',11,404,459),('06.06.21 07:45',11,405,-96),('06.06.21 07:45',12,64,250),('06.06.21 07:45',12,65,255),('06.06.21 07:45',12,66,255),('06.06.21 07:45',12,67,255),('06.06.21 07:45',12,68,260),('06.06.21 07:45',12,69,220),('06.06.21 07:45',12,70,245),('06.06.21 07:45',12,71,245),('06.06.21 07:45',12,72,250),('06.06.21 07:45',12,73,260)
> 69559 Quit



Manchmal passiert aber folgendes:



> 58712 Prepare     [1] INSERT INTO t5 (zeit,mid,kid;
> 58712 Query       INSERT INTO t5 (zeit,mid,kid



Ich weiß leider nicht, woran das liegen könnte. Oder ich sehe den Wald vor lauter Bäumen nicht.
Vielleicht hat ja jemand eine Idee.

Gruß Jens


----------



## MrQ (21. Jun 2006)

Ich habe den Fehler wahrscheinlich schon gefunden. Wenn alle Werte Null sind, schneidet meine Routine den String nach dem kid ab, da es dann das letzte Komma ist.
Mal schauen, wie ich das dann löse.
Vielleicht hat da ja jemand eine Idee.

Gruß Jens


----------



## SamHotte (21. Jun 2006)

Vielleicht tust du dich mit 'nem PreparedStatement leichter?


----------



## MrQ (22. Jun 2006)

Mache ich auch bei allen anderen Datenbankzugriffen. Aber hier weiß ich ja nicht, wie meine eigentliche Abfrage aussehen wird.
Bei PrepareStatement steht doch die Syntax der Abfrage fest und ich änder nur noch die Variablen. Oder irre ich mich da.

Gruß Jens


----------



## SamHotte (22. Jun 2006)

Sehen deine Abfragen denn nicht alle gleich aus? Irgendwie kam mir das schon so vor, dass sich nur die Werte ändern ...


----------



## DP (22. Jun 2006)

und gewöhne dir am besten direkt an, anstatt


```
String sql ="INSERT INTO "+anlagendaten.datentabelle+" (zeit,mid,kid,wert) VALUES ";
```

nen stringbuffer zu nutzen. sonst dreht sich bei größeren datenmengen dein blech nicht mehr


----------

