C und datenbanken



  • also ich muss eine anwendung schreiben die aus einer Tabelle alle reihen ausgibt die den wert 1 haben. leider gibt mein Programm nur eine komplette Reihe aus und nicht alle reihen in der eine 1 vor kommt. Hierbei handelt es sich um eine MySql datenbank.
    Fast am ende meines Codes findet ihr ihr die ausgabe der tabellen zeilen. ist es möglich dort eine schleife drum zubauen die sagt "schreibe alle zeilen die die ID 1 haben raus, wenn du keine mehr findest sag "anfrage erfolgreich" ?
    ich habe die anfrage stelle mal mit einem smilie makiert, damit ihr es findet.
    Hier mal der code

    #include <stdio.h>
    #include <stdlib.h>
    #include <mysql/mysql.h>
    #include <byteswap.h>
    #include <string.h>
    #include "structs.h"
    
    int main ()
    
    {
    
    char fID;
    char mybuf[500];
    char mybuf2[500];
    MYSQL_RES *ergebnis;
    MYSQL_ROW zeile;
    int id;
    char stri[20];
    
    /*--------------------------Initialisierung von des Handle-----------------------------*/
    
    		printf ("Initialisierung wird gestartet! \n\n");
    
    mysql_init(&mysql);
    
    /*
    	if (sql == NULL)
    
    	{	
    		fprinf (stderr, "Ist ist ein Fehler beim initialisieren aufgetaucht \n");
    		exit (0);
    	}
    */	
    
    /*---------------------------Mit dem Server verbinden----------------------------------*/
    
    	if (mysql_real_connect (&mysql,			/*Handle*/
    				"localhost",		/*Host*/
    				"root",			/*User*/
    				"",			/*Passwort*/
    				"smsd",			/*DB-name*/
    				0,			/*Port*/
    				NULL,			/*Socket*/
    				0			/*FLags*/
    				)
    	    			== NULL
    		)	    
    	{
             fprintf (stderr, "Fehler mysql_real_connect():"
                  "%u (%s)\n",mysql_errno (&mysql), mysql_error (&mysql));
    	}
    
    	else
          	printf("Sie wurden erfolgreich mit dem MySQL-Server verbunden\n\n");
    
          	id = 1;
          	strcpy(stri,"*");
    
          	sprintf(mybuf, "SELECT %s FROM logs WHERE dbid = %d", stri, id);
    
      	if(mysql_real_query(&mysql, mybuf, strlen(mybuf)));
    	printf("Starte Anfrage\n\n");
            ergebnis = mysql_use_result(&mysql);
    
             :D  :D  :D  :D  hier beginnt die anfrage. er soll die werte solang ausgeben bis er keine zeilen mehr mit id 1 findet.
    
            if(zeile = mysql_fetch_row(ergebnis))
         {
                    printf("id: %s\r\n",zeile[0]);				// Ausgabe
                    printf("dbid: %s\r\n",zeile[1]);
                    printf("nummer: %s\r\n",zeile[2]);
                    printf("txt: %s\r\n",zeile[3]);
                    printf("timestamp: %s\r\n",zeile[4]);
                    printf("Anfrage war erfolgreich\n\n");
            }
    
      mysql_free_result(ergebnis);
    
    	sprintf (mybuf2, "INSERT INTO logs (dbid, nummer, txt, tstamp) values (3, 'testFA-ID', 'test-txt', 'test-tstamp')" );
    	mysql_real_query(&mysql, mybuf2, strlen(mybuf2));
    
    /*-----------------------------Verbindung trennen---------------------------------------*/
    
      // mysql_close (&mysql);
       return 0;
    }
    

    ich danke schon mal für alle hinweise, fertige quelltext ^^ und alles was sonst an hilfe kommt 🙂



  • mach aus dem if(zeile = mysql_fetch_row(ergebnis)) ein while( zeile = mysql_fetch_row(ergebnis))
    🤡



  • ist es dann der fall das er alle zeilen die ID 1 haben raus schreibt?

    danke für deine hilfe



  • sprintf(mybuf, "SELECT %s FROM logs WHERE dbid = %d", stri, id);

    id ist bei dir 1, also kommen alle datensätze WHERE dbid = 1 😉



  • Oki doki, meine Frage hat sich erledigt, es funktioniert. dank Dir. 👍



  • neuer "arbeitsauftrag"

    also folgendes

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <mysql/mysql.h> 
    #include <byteswap.h> 
    #include <string.h> 
    #include "structs.h" 
    
    int main () 
    
    { 
    
    char fID; 
    char mybuf[500]; 
    char mybuf2[500]; 
    MYSQL_RES *ergebnis; 
    MYSQL_ROW zeile; 
    int id; 
    char stri[20]; 
    
    /*--------------------------Initialisierung von des Handle-----------------------------*/ 
    
    mysql_init(&mysql); 
    
    /* 
        if (sql == NULL) 
    
        {    
            fprinf (stderr, "Ist ist ein Fehler beim initialisieren aufgetaucht \n"); 
            exit (0); 
        } 
    */    
    
    /*---------------------------Mit dem Server verbinden----------------------------------*/ 
    
        if (mysql_real_connect (&mysql,            /*Handle*/ 
                    "localhost",        /*Host*/ 
                    "root",            /*User*/ 
                    "",            /*Passwort*/ 
                    "smsd",            /*DB-name*/ 
                    0,            /*Port*/ 
                    NULL,            /*Socket*/ 
                    0            /*FLags*/ 
                    ) 
                        == NULL 
            )        
        { 
             fprintf (stderr, "Fehler mysql_real_connect():" 
                  "%u (%s)\n",mysql_errno (&mysql), mysql_error (&mysql)); 
        } 
    
        else 
              printf("Erfolgreich mit dem MySQL-Server verbunden\n"); 
    
              id = 1; 
              strcpy(stri,"*"); 
    
              sprintf(mybuf, "SELECT %s FROM kunden WHERE id = %d", stri, id); 
           :D  :(  :rolling_eyes:  :sunglasses:  :yum:  :clown: 
          if(mysql_real_query(&mysql, mybuf, strlen(mybuf))); 
        printf("anfrage\n\n"); 
            ergebnis = mysql_use_result(&mysql); 
    
            while(zeile = mysql_fetch_row(ergebnis)) 
            { 
                    zeile[0]; 
            printf("Teil-Zeile %s\r\n",zeile[0]); 
            printf("Teil-Zeile %s\r\n",zeile[1]); 
            printf("Teil-Zeile %s\r\n",zeile[2]); 
    
            } 
    
      mysql_free_result(ergebnis);
    
    	sprintf (mybuf2, "INSERT INTO logs (dbid, nummer, txt, tstamp) values (3, 'testFA-ID', 'test-txt', 'test-tstamp')" );
    	mysql_real_query(&mysql, mybuf2, strlen(mybuf2));
    
    /*-----------------------------Verbindung trennen---------------------------------------*/
    
      // mysql_close (&mysql);
       return 0;
    }
    

    in dem stüc wo die smilies sind wird etwas aus dem archiv ausgelesen, und zwar alles mit ID1. nun soll aber das eingelesene in die logs daten bank eingetragen werden. nur weis ich nicht wie ich das mit den variablen realisieren kann. bei meine INSERET aufruf wird in logs immer nur ein fester wert eingetragen. es soll aber das eingetraen werden was zuvor ausgelsen wurde. weis jemand wie man das macht.?

    thx 4 help



  • um das ganze zu erweitern

    datenbank = smsd
    tabelle kunden -> in kunden ist archiv



  • So sollte es klappen denke ich

    while(zeile = mysql_fetch_row(ergebnis)) 
    { 
        printf("Teil-Zeile %s\r\n",zeile[0]); 
        printf("Teil-Zeile %s\r\n",zeile[1]); 
        printf("Teil-Zeile %s\r\n",zeile[2]); 
    
    	/* So sollte es klappen */
    	sprintf (mybuf2, "INSERT INTO logs (dbid, nummer, txt, tstamp) values (%s, %s, %s, %s)", zeile[0], zeile[1], zeile[2], zeile[3]); 
    	mysql_real_query(&mysql, mybuf2, strlen(mybuf2));     
    }
    


  • leider funktioniert es nicht. also er liest zwar die eine tabelle aus, fügt es aber nicht in die logs ein 😞



  • hhmmmmm...weißt nicht was da nicht passt...


Anmelden zum Antworten