Query wird nicht ausgeführt



  • Basierend auf dem Code von elise hier: http://www.c-plusplus.net/forum/viewtopic.php?t=39524 habe ich versucht mit meiner MySQL-DB zu kommunizieren. Die Verbindung klappt auch, allerdings liefert mysql_real_query -1 zurück, d.h. es wird nicht ausgeführt - wieso?
    Die Tabelle existiert auch mit den angesprochenen Spalten.

    @Win XP, VC++.NET 2003

    #include <windows.h>
    #include <string.h>
    #include <C:/mysql/include/mysql.h>
    #include <time.h>
    #include <stdio.h>
    
    void db_query(MYSQL *mysql, const char *anfrage)
    {
    	int erg = mysql_real_query(mysql, anfrage, strlen(anfrage));
    }
    
    int main ()  
    {
    	MYSQL_RES *mTabelle;
        MYSQL_ROW mRecord;
        MYSQL *mConnection, mDB;
        int mError;
        mysql_init(&mDB);
        mConnection = mysql_real_connect(&mDB,"127.0.0.1","root","","hp",0,0,0);
        if (mConnection == NULL)  
    	{
            printf("Es konnte keine Verbindung zur Datenbank hergestellt werden: %s",mysql_error(&mDB));
            return 1;
        } 
    	else 
    	{
    		printf("Es wurde erfolgreich eine Verbindung hergestellt!");
    		db_query(&mDB, "INSERT INTO Packstuecke(Nummer, Status, Zeit, SNr) VALUES(99940306644303469171, 054, 20060801094500)");
        }
        mysql_close(mConnection);
        return 0;
    }
    


  • Du gibst in Deinem Query an, dass Du 4 Spalten füllen willst, gibst aber als Werte nur 3 Spalten an.



  • erstmal brauchste keine extra funktion um nullterminierte strings abzuschicken. dafür gibt es 'mysql_query'.
    und: wenn 'mysql_query' bzw. 'mysql_real_query' keine 0 zurückgeben, dann kannste die die fehlermeldung mit 'mysql_error' abholen.
    beispiel:

    bool db_query(MYSQL *mysql, const char *anfrage)
    {
        if (mysql_query (mysql, anfrage))
        {
           printf ("mysql_error: %s\n", mysql_error(mysql));
           return false;
        }
        return true;
    }
    


  • @mantiz: *patsch* Stimmt, danke 🙂

    @net:

    Ich hab das nur gemacht, weil ich gelesen habe, dass die Performance von mysql_real_query besser sein soll und bei mysql_query unter bestimmten Umständen ein Buffer overrun auftreten kann. Und ich wollte mir halt das strlen() bei jedem Aufruf sparen 😉



  • UNeverNo schrieb:

    @net:
    Ich hab das nur gemacht, weil ich gelesen habe, dass die Performance von mysql_real_query besser sein soll und bei mysql_query unter bestimmten Umständen ein Buffer overrun auftreten kann. Und ich wollte mir halt das strlen() bei jedem Aufruf sparen 😉

    ach so. na, dann vergiss was ich geschrieben hab' 😉



  • Hab nochmal eine andere Frage - wie kann ich zurückgegebene Datensätze bei einem SELECT verarbeiten?

    ergebnis = mysql_store_result(&mysql);
        if (ergebnis)  // Es gibt Zeilen
        {
             //was muss hier rein?
        }
    


  • UNeverNo schrieb:

    //was muss hier rein?

    z.b. solange 'mysql_fetch_row' aufrufen um alle zeilen abzuholen (bis 0 zurückgegeben wird)



  • Jetzt tritt ein Fehler auf, anscheinend werden die Spalten anders als in PHP angesprochen.

    erg = mysql_store_result(&mDB);
    		if (erg)
    		{
    			anz_felder = mysql_num_fields(erg);
    			while (zeile = mysql_fetch_row(erg))
    			{
    				printf("SNr = %s", zeile['SNr']); //Unbehandelte Ausnahme bei 0x00401112 in myTest.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x0181e6b0.
    			}
    		}
    


  • UNeverNo schrieb:

    printf("SNr = %s", zeile['SNr']); // Unbehandelte Ausnahme bei 0x00401112 in myTest.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x0181e6b0.

    c hat keine assoziativen arrays. musst 'ne zahl nehmen, keinen string...



  • Danke soweit schon mal für Deine Hilfe 👍

    Jetzt habe ich noch einen Fehler, finde ihn aber nicht.

    #include <windows.h>
    #include <string.h>
    #include <C:/mysql/include/mysql.h>
    #include <time.h>
    #include <stdio.h>
    
    int db_query(MYSQL *mysql, const char *anfrage, int index) //schreibt in DB oder liefert GENAU einen Wert zurück
    {
    	MYSQL_RES *erg;
        MYSQL_ROW zeile;
    	//unsigned int anz_felder;
    
    	int err = mysql_real_query(mysql, anfrage, strlen(anfrage));
    	if (err != 0)
    		printf("Abfrage %s konnte nicht erfolgreich ausgefuehrt werden!", anfrage);
    
    	if (index != -1)
    	{
    		erg = mysql_store_result(mysql);
    		if (erg)
    		{
    			//anz_felder = mysql_num_fields(erg);
    			while (zeile = mysql_fetch_row(erg))
    			{
    				return ((int)zeile[index]);
    			}
    		}		
    	}
    	return -1;
    }
    
    int main ()  
    {
        MYSQL *mConnection, mDB;
        int mError;
        mysql_init(&mDB);
        mConnection = mysql_real_connect(&mDB,"127.0.0.1","root","","hp",0,0,0);
    
        if (mConnection == NULL)  
    	{
            printf("Es konnte keine Verbindung zur Datenbank hergestellt werden: %s",mysql_error(&mDB));
            return 1;
        } 
    	else 
    	{
    		printf("Es wurde erfolgreich eine Verbindung hergestellt!");
    /*c:\Dokumente und Einstellungen\Chris\Desktop\libmysqltest\myTest.c(47): error C2143: Syntaxfehler: Es fehlt ';' vor 'eingeben'
    */		int erg = db_query(&mDB, "SELECT * FROM Packstuecke", 3);
        }
        mysql_close(mConnection);
        return 0;
    }
    

    Vor eingeben? Bei mir ist nix mit eingeben...


Anmelden zum Antworten