MySQL Datenbank Insert-Befehl

Moin,

ich möchte ohne PHP eine Maria-Datenbank beschreiben. Der Code steht auch und ich kann feste Werte, d.h. die ich direkt in den INSERT--Befehl schreibe auf die Datenbank schreiben.

char INSIERT_TABEL_SQL[] = "INSERT INTO Messwerte (Temperatur BME in C) VALUES (2.52) ";

Nun würde ich gerne aber dort Messwerte rein schreiben.

char INSIERT_TABEL_SQL[] = "INSERT INTO Messwerte (Temperatur BME in C) VALUES ($temp1) ";

Ich suche nun schon seit Tagen die richtige Syntax damit das Programm die Variable temp1 nimmt. Es ist nicht $ es ist nicht % (wie in den Beispielen der IDE). Ich finde nichts darüber, wie ich eine Variable im Insert-Befehl bekann manche.

Hier der Code
.
.
.


// Sample query

char INSIERT_TABEL_SQL[] = "INSERT INTO Messwerte (`Temperatur BME in C`)VALUES ($temp1) ";

WiFiClient client;

MySQL_Connection conn((Client *)&client);

float temp1

void setup() {

Serial.begin(115200);

// Begin WiFi section

WiFi.begin(ssid, pass);

// Wait for connection

while ( WiFi.status() != WL_CONNECTED ) {

delay ( 500 );

Serial.print ( "." );

}

Serial.println ( "" );

Serial.print ( "Connected to " );

Serial.println ( ssid );

Serial.print ( "IP address: " );

Serial.println ( WiFi.localIP() );

// End WiFi section

Serial.println("DB - Connecting...");

while (conn.connect(server_addr, 3306, user, password, db) != true) {

delay(500);

Serial.print ( "." );

}

void loop() {

delay(2000);

temp1 = 1.25;

Serial.println(temp1);

Serial.println("Recording data.");

// Initiate the query class instance

MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);

// Execute the query

cur_mem->execute(INSIERT_TABEL_SQL);

// Note: since there are no results, we do not need to read any data

// Deleting the cursor also frees up memory used

delete cur_mem;

}

temp1 steht da so drin, damit ich erstmal nur "einen" Fehler habe. Natrülich soll dort später die Sensordaten hinerlegt werden. Aber wenn der Code nun zu kompliziert, wird kann der Fehler wieder überall liegen. Als Anfänger muss man kleine Schritte machen!

Ich gehe davon aus, dass ich den Wald vor lauter Bäumen nicht sehe und mir schon zu viele Threads angeguckt habe und deswegen mache ich jetzt ne Pause und gehe raus an die frische Luft. Hoffe einer weiß die Lösung und teilt die mir mit!

DANKE

DAVID

Du musst entweder aus dem Inhalt der Values-Klammer eine Zeichenkette bilden oder das gleich mit snprintf zusammenbasteln.

char sql[150]; // an Deine Gegebenheiten anpassen (auszählen+Reserve)
int res = snprintf(sql,sizeof(sql),"INSERT INTO Messwerte (Tem,ort) VALUES (%3.2f,%d)",floatVariable,intVariable);

Formatierung der printf-Familie

Gewöhne Dir bitte die unnötigen Leerzeilen im Code ab. Die stören den Lesefluss.

Gruß Tommy

eigentlich würdest einfach einen buffer initialisieren und ihn mit strcat mit weiteren Werten befüllen.

Ganz bequem wird das mit der Kombination von PString und Streaming.

PString macht dir einen char Buffer "print-bar",
Streaming macht das ganze noch einfacher und du "streamst" dann in deinen Buffer.

wirft zwar 2 Warnings in dieser Kombination, aber funktioniert einwandfrei mit einem sehr kleinen Speicherbedarf:

#include <PString.h>
#include <Streaming.h> // 2044/256

void setup() {
  Serial.begin(115200);

  float temp = 1.42;
  char buffer[100] = {0};
  PString message(buffer, sizeof(buffer));
  message << "INSERT INTO Messwerte (`Temperatur BME in C`)VALUES (" << temp << ")";
  Serial.println(message);
  
  Serial.println(buffer);
}

void loop() {
}

lässt sich auch mit dem F-Makro kombinieren:

#include <PString.h>
#include <Streaming.h> // 2086/200

void setup() {
  Serial.begin(115200);

  float temp = 1.42;
  char buffer[100] = {0};
  PString message(buffer, sizeof(buffer));
  message << F("INSERT INTO Messwerte (`Temperatur BME in C`)VALUES (") << temp << ')';
  Serial.println(message);
  
  Serial.println(buffer);
}

void loop() {
}
1 Like

Wenn du wirklich Gleitkommawerte in eine Datenbank schreiben willst/musst, ist der Umweg über einen Text mit Punkt und einigen (default 2) Nachkommastellen fragwürdig.
Auch MariaDB kennt Parameter und Prepared Statements.

Allerdings sind Gleitkommazahlen für Temperaturen im Haushaltsbereich auch albern und sprintf somit nicht wirklich daneben.

Aber die verwendete Lib kennt das nicht. Die kann nur SQL-Zeichenketten verarbeiten und wenn float gewünscht sind, muss man das halt so machen.

Deshalb (und wegen https, was in den wenigsten gemieteten DB ein compiliert ist) gehe ich in meinen Anwendungen, die eine ferne DB nutzen, den Weg über PHP und prepared Statements.

Gruß Tommy

1 Like

Abend zusammen,

danke nochmal für eure Hilfe. Ich habe mich für Tommy56 Antwort enschieden. Diese habe ich einfach verstanden. :slight_smile: Bin halt Anfänger.

Mit dem Code von Tommy hat es aber nicht funktioniert, da mir ein Fehler bei der
int res = snprintf(sql,sizeof(sql),"INSERT INTO Messwerte (Tem,ort) VALUES (%3.2f,%d)",floatVariable,intVariable);
ausgegeben wurde, dass er int res nicht kennt.

Ich habe es dann wie folgt Programmiert. Ich habe halt die Zeichen für den gesamten Befehl über Word zählen lassen und +1 genommen. Somit hatte ich für die
char sql[150];
die Zahl der Zeichen in meinem Befehl. Die kommt dann als "Globale Variabel" über void setup. Dann habe ich die
snprintf(sql, sizeof(sql), "INSERT INTO...
direkt im void loop genutzt. Dann kam kein Fehler mehr und er hat alles gemacht!
Danke!

Ach und zu den Leerzeichen Tommy56 die machen für mich als Legastheniker sehr viel Sinn. Sonst denkt sich mein Gehirn leider Klammern und Simikolons dazu und ich würde noch mehr Fragen. :slight_smile: Kann mir aber vorstellen, dass für viele dann der Lesefluß leidet.

Die Gedanken zu INT und FLOAT habe ich auch schon gehabt. Aber bin dann doch bei FLOAT geblieben.

Gerne mich PN schreiben, wenn jemand meine Ausführung nicht versteht. :slight_smile:

DAVID

Ich hatte LeerZeilen geschrieben.

Gruß Tommy

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.