Announcement

Collapse
No announcement yet.

char Array in Datenbank

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Schnapphase
    started a topic char Array in Datenbank

    char Array in Datenbank

    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?

  • Schnapphase
    replied
    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.

    Leave a comment:


  • Christian Marquardt
    replied
    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:


  • Schnapphase
    replied
    Originally posted by Christian Marquardt View Post
    int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

    Die Query zusamensetzen und die Länge angeben
    Wie? Das ist ja gerade mein Problem Ich weiss ja nicht, wie ich die Binaerdaten in meinem querystring bekomme, mit sprintf kriege ich es nicht hin.

    Leave a comment:


  • Christian Marquardt
    replied
    int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

    Die Query zusamensetzen und die Länge angeben

    Leave a comment:


  • Schnapphase
    replied
    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 Post
    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.)
    Ah okay, das beachte ich. Aber ichw eiss immer noch nicht, wie ich die Binaerdaten da rein fuettere. Die mysql_real_query() funktion bietet mir ja endlich die gewunschte Laengenangabe, also ich verstehe, dass ich die binaerdaten da reinfuettern kann. aber ich muss ja noch die MySQL Befehle wie "INSERT into...." bzw "UPDATE..." voranstellen...?

    Leave a comment:


  • Christian Marquardt
    replied
    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:


  • Christian Marquardt
    replied
    Das war meine erste Frage:

    kommt darauf an, was das char enthält (Binärdaten),
    Deine Antwort:

    char[] laberlaber = " hallohallo';

    Leave a comment:


  • Schnapphase
    replied
    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:


  • Christian Marquardt
    replied
    Code:
    char *buffer="esefsfsdfsdfsdf";
    int ID=5;
    char ziel [50];
    sprintf(ziel, "INSERT INTO map VALUES (%d, '%s')", ID, buffer);
    funktioniert hier einwandfrei

    Leave a comment:


  • Schnapphase
    replied
    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);
    so funktionierts nicht, da er ja anscheinend die Adresse, auf die "buffer" zeigt, als String in "querystring" schreibt. mit einem "*buffer" statt "buffer" gehts auch nicht. Wie mache ich das also?

    Leave a comment:


  • Christian Marquardt
    replied
    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:


  • Schnapphase
    replied
    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);
    funktioniert bestens. Aber der "buffer" den ich da habe, ich ein char*. Wie kriege ich das hin? Ein *buffer bringts nicht

    Leave a comment:


  • Christian Marquardt
    replied
    Meine Frage hier dreht sich mehr um die richtige Wahl der Datentypen fuer die Tabelle
    warum nicht:

    als Blob ablegen

    Leave a comment:


  • Schnapphase
    replied
    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:

Working...
X