Hallo,
ich entwickle eine C++ Applikation, die auf eine mySQL Datenbank zugreift. Dazu baue ich mit sprintf() qureystrings zusammen, was auch alle ssoweit gut funktioniert.
Ich moechte nun den Inhalt eines UDP Pakets in der Datenbank ablegen. Ich habe also einen Zeiger auf einen char* und eine Laengenangabe. wie kriege ich das nun in die Datenbank? Wie muss die Tabelle aussehen, also was soll ich da fuer einen Datentyp nehmen? varchar? int?
Und wie kriege ich das wieder raus?
Announcement
Collapse
No announcement yet.
char Array in Datenbank
Collapse
X
-
alles klar, damit sollte es gehen. Vielen Dank fuer die ausfuehrliche und geduldige Hilfestelleung!
Beste Gruesse
Edit: Es funktioniert jetzt. Sollte jemand das gleiche Problem haben, hier der Code:
Code:sprintf(temp1, "INSERT INTO map VALUES (%d, '2000-01-01 00:00:00', '",ID); sprintf(temp2, "')"); memcpy(querystring, temp1, strlen(temp1)); memcpy(querystring + strlen(temp1), buffer, length); memcpy(querystring + strlen(temp1) + length, temp2, strlen(temp2)); if (mysql_real_query(connection, querystring, strlen(temp1) + length + strlen(temp2) )) printf("MySQL Error %u: %s\n", mysql_errno(connection), mysql_error(connection));
Zuletzt editiert von Schnapphase; 15.03.2010, 23:16.
-
Speicher reservieren
- den String INSERT INTO map VALUES (
- die ID
- den Buffer
- das Ende )
reinkopieren und dabei die Längen merken.
Dafür gibt es memcpy und Verwandte
Leave a comment:
-
Originally posted by Christian Marquardt View Postint mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
Die Query zusamensetzen und die Länge angeben
Leave a comment:
-
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
Die Query zusamensetzen und die Länge angeben
Leave a comment:
-
Ah ok, dann haben wir aneinander vorbei geredet bzw ich hab falsch auf die Frage geantwortet. Mir kommt es ausschliesslich auf die Binaerdaten an.
Mit Text/ASCII hat mein Problem eigentlich garnichts zu tun. Ich hatte Text nur in meinem Beispielcode verwendet, damits leichter zu lesen ist, aber du hast Recht, damit veraendere ich ja das Problem voellig.
Originally posted by Christian Marquardt View Posthttp://dev.mysql.com/doc/refman/5.1/en/mysql-query.html
mysql_query() cannot be used for statements that contain binary data; you must use mysql_real_query() instead. (Binary data may contain the “\0” character, which mysql_query() interprets as the end of the statement string.)
Leave a comment:
-
http://dev.mysql.com/doc/refman/5.1/en/mysql-query.html
mysql_query() cannot be used for statements that contain binary data; you must use mysql_real_query() instead. (Binary data may contain the “\0” character, which mysql_query() interprets as the end of the statement string.)
Leave a comment:
-
Das war meine erste Frage:
kommt darauf an, was das char enthält (Binärdaten),
char[] laberlaber = " hallohallo';
Leave a comment:
-
Hi,
wenn ich es so mache wie du, geht es auch. Aber ich will ja keinen Text bzw. keine ASCII Zeichen speichern, sondern einfach Bytes, naemlich die Daten, die ich aus meinem UDP Paket empfangen habe. Und das funktioniert dann nicht, da sprintf mit Attribut %s nur ASCII Zeichen kopiert. Ich muesste also mit %X oder %d arbeiten, um wirklich die Bytes, die in meinem char Array stehen, in den String zu schreiben.
Also wenn meine Daten im Speicher so aussehen: "00 01 58 12 DE F8 ........ A0" dann will ich das irgendwie in die Tabelle packen. Wie das in der Tabelle steht, ist mir egal, ich will die Daten nur speichern. Dann will sie wieder extrahieren, um ein UDP Paket zu bauen, was dann wieder rausgesendet wird.
Leave a comment:
-
Code:char *buffer="esefsfsdfsdfsdf"; int ID=5; char ziel [50]; sprintf(ziel, "INSERT INTO map VALUES (%d, '%s')", ID, buffer);
Leave a comment:
-
Mit SQL hat das jetzt nichts mehr zu tun. Ich will einfach die Daten, die im Speicher liegen, in mein char Array "querystring" kopieren. Und ich weiss nicht, wie das geht.
Code:// UDP Paket empfangen recvSize = recvfrom(listenSocket, buffer, sizeof(buffer) * MAXMSGLEN, 0, (struct sockaddr*) &clientAddress, &sockaddrSize); // querystring bauen - kann so natuerlich nicht funktionieren... sprintf(querystring, "INSERT INTO map VALUES (%d, '%s')", ID, *buffer); // query mysql_query(connection, querystring);
Leave a comment:
-
mysql_query gehört zur C-API. Es ist keine C++ API
Und was funktioniert an dem sprintf nicht? Was hat das mit MySQL zu tun?
Leave a comment:
-
Hi,
wie wuerde dann die Konstruktion des Querystrings aussehen? Das kriege ich gerade nicht hin.
Also ein:
Code:char[] laberlaber = " hallohallo'; sprintf(querystring, "INSERT INTO map VALUES (%d, '%s')", ID, laberlaber);
Leave a comment:
-
Meine Frage hier dreht sich mehr um die richtige Wahl der Datentypen fuer die Tabelle
als Blob ablegen
Leave a comment:
-
Hi!
Danke fuer die Antwort. Ich arbeite mit der C++ API. Also, ich weiss wie ich querystrings bauen kann und lesen bzw. schreiben auf die DB funktioniert auch soweit. Meine Frage hier dreht sich mehr um die richtige Wahl der Datentypen fuer die Tabelle udn halt, wie ich das Array in die Tabelle kriege.
Zur Zeit sieht das etwa so aus:
Code:// UDP Paket empfangen recvSize = recvfrom(listenSocket, buffer, sizeof(buffer) * MAXMSGLEN, 0, (struct sockaddr*) &clientAddress, &sockaddrSize); // querystring bauen - kann so natuerlich nicht funktionieren... sprintf(querystring, "INSERT INTO map VALUES (%d, '%s')", ID, buffer); // query mysql_query(connection, querystring);
Leave a comment:
Leave a comment: