Frage zu PQexecParams/PQexecPrepared von libpq

Nachdem ich nun erfolgreich zur Datenbank verbinden kann und auch mit PQexec Werte in die Datenbank schreiben kann hab ich folgendes weiteres Problem:
Da ich in kurzen Abständen nacheinander sich ständig änderende Werte in die Datenbank eintragen muss, geht das wohl mit der Funktion PQexec nicht, da man in den Query nicht wie bei PHP mal kurz Variablen einbauen kann. Deshalb gibts wohl z.B die Funktion PQexecParams, wo man die Werte vorher in einem Array definiert und dann im Query mit $1, $2,… auf die einzelnen Werte zugreifen kann. Das funktioniert auch, sofern es sich bei dem Wert den ich in dieses Array schreibe um text handelt. Sobald das aber was anderes ist, bekomm ich beim kompilieren die Fehlermeldung: “incompatible types in initinalization”. Das ist eigentlich auch kein Wunder, da ein Array in C ja eigentlich nur einen bestimmten Datentyp haben kann. Aber wie soll man dann verschiedene Datentypen in die Datenbank schreiben können?

Gruß, Sven

Versuch doch einfach einen Cast.

Ja, da hab ich auch schon dran gedacht. Bin aber nicht so ganz fit was C angeht. Hab mal was versucht, aber das tut noch nicht.

const char *const paramValues[3]={C->callsign,(char)C->lat,(char)C->lon};

Der zweite und dritte Wert bei der Initialisierung sind eigentlich double Werte. So kommt die Meldung: “initialization makes pointer form integer without a cast”.

Kann mir da jemand mit den Pointern und den Casts auf die Sprünge helfen?

Den Wert gibst du ja in paramTypes an, die Werte in paramValues sind alle ganz normale Strings - so man in C überhaupt von Strings sprechen kann.

Die Umwandlung kann z.B. sprintf() für dich erledigen.

Kann mir jemand mal ein Beispiel posten, wie man sowas hier

C->lat

mit sprintf() oder auch sonst irgendwie in nen String umwandelt, sodass ich das in paramValues verwenden kann? Tut mir leid wenn ich mich da irgenwie blöd anstelle, aber ich bin normalerweise Sprachen wie JavaScript oder PHP gewohnt, wo man sich um sowas nicht kümmern muss. Bei paramTypes weiß ich auch nicht, was ich da angeben soll. Da werden offenbar irgendwelche OIDs von den Datentypen verlangt. Keine Ahnung wie die heißen müssen. :confused:

sprintf funktioniert genauso wie in PHP.

Ok danke, habs jetzt hinbekommen. Für alle die’s auch interessiert hier meine Lösung:

char la[20];
char lo[20];
sprintf (la, "%e", C->lat);
sprintf (lo, "%e", C->lon);
const char *const paramValues[3]={C->callsign,la,lo};