DATETIME von C++ in HeidiSQL DB Funktioniert nicht!



  • Hallo alle zusammen,
    ich habe ein kleines Problem,

    ich habe mit C++ ein Programm geschrieben mit dem ich über eine Serielle Schnittstelle und einer Platine die Temperatur der Umgebung auswerten kann. Jetzt möchte ich die Temperatur mit dem Datum in eine Datenbank bei HeidiSQL reinschreiben wenn ich das Programm Kompiliere. Allerdings wird in die Datenbank bei HeidiSQL immer 0000-00-00 00:00:00 eingetragen. Das Format des Feldes ist DATETIME.
    Kleiner auzug aus dem Programm:

    mysql_real_connect (conn, opt_host_name, opt_user_name, opt_password,
        opt_db_name, opt_port_num, opt_socket_name, opt_flags);
        time_t t;
        time(&t);
    
        struct tm *newtime;
        time_t long_time;
    
        time( &long_time ); 
        newtime = localtime( &long_time );
    
        time_t x = time (NULL);
        struct tm * timeinfo = localtime ( &x );
        printf ("%04d-%02d-%02d %02d:%02d:%02d\n",timeinfo->tm_year+1900, timeinfo->tm_mon+1, timeinfo->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
    
        /* show tables in the database (test for errors also) */
        (mysql_query(conn, "insert into messung (Zeitstempel, Temperatur) values ('%04d-%02d-%02d %02d-%02d-%02d' , '%.1f')"),timeinfo->tm_year+1900, timeinfo->tm_mon+1, timeinfo->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec, fMesswert);
    
            fprintf(stderr, "%s \n", mysql_error(conn));
    
        res = mysql_use_result(conn); /* grab the result */
    
        printf("Tables in database\n");
    

    wenn ich die Zeile 18 mit der folgenden Zeile ersetze,

    (mysql_query(conn, "insert into messung (Zeitstempel, Temperatur) values ('2011-04-28 11-20-23' , '22.5')"));
    

    dann wird in die Datenbank das richtige gewünschte Format eingetragen.

    In der Datenbank bei HeidiSQL sind 2 Spalten die Zeitstempel und Temperatur heißen und deren Format ist einmal DATETIME und FLOAT

    Könnte mir Bitte jemand Helfen was ich noch Falsch gemacht habe?

    Im Voraus schon mal Herzlichen Dank!

    MFG Yves Sebastian



  • Hast du mal probiert, den Datumsstring erst zusammenzubauen und dann am Stück an die Datenbank zu übergeben?

    char dateval[20];
    sprintf(dateval,"%04d-%02d-%02d %02d-%02d-%02d",timeinfo->tm_year+1900, timeinfo->tm_mon+1, timeinfo->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
    mysql_query(conn, "insert into messung (Zeitstempel, Temperatur) values ('%s' , '%.1f')"),dateval, fMesswert);
    


  • Hatte dies noch nicht ausprobiert, aber leider Funktioniert dies auch nicht.

    Wie könnte man dieses Problem denn noch lösen?

    MfG Yves Sebastian



  • Nur zur Sicherheit: Reden wir hier von dieser Funktion? Nach der Signatur und Beschreibung arbeitet die Funktion nicht mit variablen Argumentlisten (oder printf()-artiger Formatierung), also müsstest du die komplette Anweisung zusammenbauen, bevor du sie an mysql_query() übergibst.
    (ich bin mir nicht sicher, ob es in der Library irgendwas gibt, um Bind-Variablen auszudrücken bzw. zu füllen)



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das kann ich nicht genau sagen. Es ist bei Heidi SQL eine Tabelle angefertigt worden wie zuvor schon beschrieben und es ist bei Allow NULL ein Haken. Bei DEFAULT steht auch NULL. Könnte das schon weiterhelfen um die Funktion zu bestimmen?



  • Es geht hier nicht um die darunterliegende Datenbank, sondern um die Funktion(en), mit der du aus deinem C-Programm auf diese Datenbank zugreifst.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Datenbanken verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich weiß nicht genau was du damit meinst, aber ich kann dir sagen, dass ich eine Erweiterung des C++ installiert habe um mit C++ Daten in die Datenbank von HeidiSQL reinshreiben kann. Und die Funktionen die man nutzen kann oder nutzen sollte kenne ich noch nicht da ich mich noch nicht so gut auskenne. So wie es aber eingestellt ist soll es wohl funktionieren.

    MYSQL *conn; /* pointer to connection handler */
        MYSQL_RES *res; /* holds the result set */
        MYSQL_ROW row;
    
        /* initialize connection handler */
        conn = mysql_init (NULL);
    
        /* connect to server */
        mysql_real_connect (conn, opt_host_name, opt_user_name, opt_password,
        opt_db_name, opt_port_num, opt_socket_name, opt_flags);
        time_t t;
        time(&t);
    
        struct tm *newtime;
        time_t long_time;
    
        time( &long_time ); 
        newtime = localtime( &long_time );
    
        time_t x = time (NULL);
        struct tm * timeinfo = localtime ( &x );
        printf ("%04d-%02d-%02d %02d:%02d:%02d\n",timeinfo->tm_year+1900, timeinfo->tm_mon+1, timeinfo->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec);
    
        char Datum[20];
    
        sprintf(Datum,"%04d-%02d-%02d %02d:%02d:%02d",timeinfo->tm_year+1900, timeinfo->tm_mon+1, timeinfo->tm_mday, newtime->tm_hour, newtime->tm_min, newtime->tm_sec, &Datum); 
    
        (mysql_query(conn, "insert into messung (Zeitstempel, Temperatur) values ('%s' , '%.1f')"),Datum, fMesswert);
          /* show tables in the database (test for errors also) */
    
            fprintf(stderr, "%s \n", mysql_error(conn));
    
        res = mysql_use_result(conn); /* grab the result */
    
        printf("Tables in database\n");
        printf("%s, %.1f\n",Datum, fMesswert);
    

    In die Tabelle von HeidiSQL wird immer nur 0000-00-00 00:00:00 eingetragen.
    Unten in Zeile 40 gibt er mir es richtig aus beim kompilieren, aber nicht in der Tabelle.
    Ist das ein Fehler im Format, da er das Datum nicht richtig einträgt?



  • Hast du denn eine Dokumentation für die Funktionen mysql_init(), mysql_query() etc, die du in diesem Code-Abschnitt verwendet hast? Wenn ja, sollte dort auch drinstehen, wie sie richtig eingesetzt werden können.
    Im Zweifelsfall hilft es sicher, wenn du erst den kompletten INSERT-String zusammensetzt (inklusive der zu verwendenden Werte), bevor du ihn an mysql_query weitergibst.

    PS: Landet eigentlich der richtige Wert in dem float-Feld?



  • Nein leider habe ich keine Dokumentationen darüber.
    Der Wert im Float Feld wird auch nicht richtig übertragen.

    Wie meinst du denn das mit dem INSERT-String? Ich habe ja schon alles zusammen gefasst mit char?



  • Yves Sebastian schrieb:

    Wie meinst du denn das mit dem INSERT-String? Ich habe ja schon alles zusammen gefasst mit char?

    Die Anweisung, die du an die Datenbank schickst.
    Beim Googlen nach "mysql_query" bin ich auf die oben angegebene Funktion gestoßen, die aber nicht ganz zu der Art passt, wie du sie verwendest. Die unterstützt anscheinend keine printf()-Formatierungen zum Zusammenbau der SQL-Anweisungen, also müsstest du die komplette Anweisung vorher zusammenbauen und dort auch die einzufügenden Werte einsetzen.



  • Ich hatte jetzt mal Google gefragt aber auch nicht gefunden wie ich dies in einem String Verfasse und das in die Datenbank bekomme. Ich komme grad nicht weiter und würde gerne nochmal um Hilfe Bitten.

    Schonmal im Vorraus Danke!



  • Du kennst doch schon printf(), das hat auch einen Bruder namens sprintf(). Wobei, wenn du mit C++ arbeitest, würde ich eher mit std::string und std::stringstream arbeiten.



  • Ich hab es auch mit den Strings versucht aber dies funktioniert leider auch nicht. Ich werde mich Morgen nochmal an die Aufgabe setzen und dann löse ich dieses Problem.

    Herzlichen Dank schonmal für deine Hilfe!



  • Ich habe das Problem gelöst.
    Mit einem string zu arbeiten ist richtig:

    MYSQL *conn; /* pointer to connection handler */
        MYSQL_RES *res; /* holds the result set */
        MYSQL_ROW row;
    
        /* initialize connection handler */
        conn = mysql_init (NULL);
    
        /* connect to server */
        mysql_real_connect (conn, opt_host_name, opt_user_name, opt_password,
        opt_db_name, opt_port_num, opt_socket_name, opt_flags);
        time_t t;
        time(&t);
    
        char query[256];
    
        sprintf(query, "insert into messung (Zeitstempel, Temperatur) values (Current_Timestamp, %.1f)",fMesswert);
        mysql_query(conn, query);
    
            fprintf(stderr, "%s \n", mysql_error(conn));
    
        res = mysql_use_result(conn); /* grab the result */
    
        printf("Tables in database\n");
    

    Herzlichen Dank für die Hilfe!!!
    MfG Yves Sebastian


Anmelden zum Antworten