Announcement

Collapse
No announcement yet.

char Array in Datenbank

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

  • 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?

  • #2
    kommt darauf an, was das char enthält (Binärdaten), ggf. als Blob ablegen.

    Wie das in die DB gespeichert wird und wieder geladen wird, hängt wohl von der genutzten Zugriffs-Lib ab
    Christian

    Comment


    • #3
      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);

      Comment


      • #4
        Meine Frage hier dreht sich mehr um die richtige Wahl der Datentypen fuer die Tabelle
        warum nicht:

        als Blob ablegen
        Christian

        Comment


        • #5
          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

          Comment


          • #6
            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?
            Christian

            Comment


            • #7
              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?

              Comment


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

                Comment


                • #9
                  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.

                  Comment


                  • #10
                    Das war meine erste Frage:

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

                    char[] laberlaber = " hallohallo';
                    Christian

                    Comment


                    • #11
                      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.)
                      Christian

                      Comment


                      • #12
                        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...?

                        Comment


                        • #13
                          int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

                          Die Query zusamensetzen und die Länge angeben
                          Christian

                          Comment


                          • #14
                            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.

                            Comment


                            • #15
                              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
                              Christian

                              Comment

                              Working...
                              X