Forum: PC-Programmierung C Funktion als Parameter übergeben zum Befüllen einer Datenbank mit Hilfe der Insert- Funktion


von Nacht E. (nachteule)


Lesenswert?

Hallo zusammen!

Ich hab folgendes Problem:

Ich möchte gerne auf meinem Raspberry Pi lokal eine Postgresql Datenbank 
laufen lassen, in welcher Daten aus einem Sensor kommend, gespeichert 
werden.
Das ganze funktioniert bis jetzt ganz gut nur hab ich das Problem, dass 
ich die Daten welche ich aus einer Funktion namens read_adc_voltage(1, 
0) herausbekomme und den Datentyp double besitzen nicht in die Datenbank 
speichern kann. Die Ausgabe auf der Konsole funktioniert.

Geschrieben hab ich das Programm in C und er meckert an dieser Stelle:
1
res = PQexec(conn, "INSERT INTO Kaffeemaschine_M1 VALUES(current_timestamp, read_adc_voltage(1, 0), 1, 1)");

Und spuckt folgende Fehlermeldung aus:

Keine Funktion stimmt mti dem angegebenen Namen und Argumenttypen 
überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen 
hinzufügen.

Wenn ich anstatt der Funktion irgend ne Zahl übergeb funzt das Ganze 
ohne Probleme.

Gebaut wird die Tabelle der Datenbank mit folgendem Befehl:
1
res = PQexec(conn, "CREATE TABLE Kaffeemaschine_M1(Zeit timestamp, i_t double precision, i_eff double precision, Leistung double precision)");

Kann ich keine Funktion als Parameter in die Insert Funktion von 
Postgresql übergeben? Bzw wie schaff ich es zu einem Ergebnis zu kommen?

Danke schonmal im Voraus und viele Grüße!

Nachteule

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Nacht E. schrieb:
> Kann ich keine Funktion als Parameter in die Insert Funktion von
> Postgresql übergeben? Bzw wie schaff ich es zu einem Ergebnis zu kommen?

Die DB kann nicht einfach so eine von Dir geschriebene C-Funktion 
aufrufen.

So geht es aber:
1
   char sql[256];
2
3
   sprintf (sql, "INSERT INTO Kaffeemaschine_M1 VALUES(current_timestamp, %d, 1, 1)", read_adc_voltage(1, 0));
4
5
   res = PQexec(conn, sql);

Ich weiß jetzt nicht, was Deine Funktion read_adc_voltage() 
zurückliefert, ich habe mal int angenommen. Falls es double oder float 
ist, musst Du den Format-Bezeichner noch anpassen.

von Nacht E. (nachteule)


Lesenswert?

Vielen vielen Dank!! Hab's auf double angepasst und schon funktioniert 
es =)
Da hätte man selber auch darauf kommen können^^

Ich wollte den Rückgabewert der Funktion vorher in einer Variable 
speichern, aber hatte dann ja wieder dasselbe Problem, dass Postgresql 
nicht wusste was in der Variablen drinsteht..

Schönen Tag noch!

von Dr. Sommer (Gast)


Lesenswert?

Sobald man Strings speichern will sollte man die korrekt escapen... 
Google mal nach SQL Injection. Das ist in C dann leider etwas fummelig.

von vn nn (Gast)


Lesenswert?


von Jim M. (turboj)


Lesenswert?

Dr. Sommer schrieb:
> Sobald man Strings speichern will sollte man die korrekt escapen...

Nix escapen. Man benutzt ein "Prepared Statement". Dadurch wird das SQL 
sauber von den Daten getrennt.


Ist bein einer Kaffemaschine vermutlich nicht relevant, aber man kann 
das einmal vorbereitete SQL Statement mehrmals wieder ausführen. Spart 
deutlich Zeit z.B. bei vielen Inserts hintereinander.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.