www.mikrocontroller.net

Forum: PC-Programmierung mySQL-C-API - Problem!


Autor: Eskuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Ich bin kurz vor der Verzweiflung.

Ich versuche seit 3 Stunden eine Abfrage in mySQL mittels eines 
C-Programms.
Ganz einfache Aufgabe, leider für mich unlösbar:

In der Datenbank "TestDB" befindet sich die Tabelle "TestDB_Tab1". Ich 
möchte einfach nur den darin enthaltenen "Vornamen" auf der Konsole 
ausgeben.
Nichts weiter.

Leider funktioniert es bei mir nicht, da das tolle Buch das ich zur Zeit 
lese (C von A bis Z) nicht mal ein einfaches Beispiel zur Abfrage der 
Datenbank liefert.


Könnt ihr mir vielleicht nochmal erklären, mit welcher Funktion ich 
überhaupt eine Abfrage an die mySQL machen kann? Ich finde nichts, was 
mir weiterhilft.

Hier mein Quellcode:

#include <stdio.h>
#include <mysql.h>
#include <errmsg.h>


int main (void)
{
  int anfrage;
char sSQL;
  unsigned int error;
  MYSQL *my;
  my = mysql_init(NULL);
  if(my == NULL) 
  {
     fprintf(stderr, "Fehler beim Initialisieren \n");
  }
  else
  {
     printf("hat geklappt!\n");  
  }

  if( mysql_real_connect (my,"localhost","root","1234","TestDB",0,NULL,0)== NULL)
  {
     fprintf (stderr, "Fehler mysql_real_connect():""%u (%s)\n",mysql_errno (my), mysql_error (my));
  }

  else
  {
        printf("Erfolgreich mit dem MySQL-Server verbunden\n");
       
  }

}







Vielen Dank schonmal im Voraus!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das gehört ja auch nicht zu C, sondern zu mysql: 
http://dev.mysql.com/doc/

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für so etwas würde ich mir ein fertiges Beispiel anpassen.
z.B.:
http://www.metalshell.com/source_code/18/Mysql_Select.html

Wie weit kommst Du denn? Bis "erfolgreich verbunden..." oder liegt das 
Problem schon beim compilieren?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <stdio.h>
#include <mysql.h>
#include <errmsg.h>


int main (void)
{
  //int anfrage;
  //char sSQL;
  //unsigned int error;
  MYSQL *my;

  my = mysql_init(NULL);
  if(my == NULL) 
  {
    fprintf(stderr, "Fehler beim Initialisieren \n");
  }
  else
  {
    printf("hat geklappt!\n");
  }

  if( mysql_real_connect( my, "localhost", "root", "xxxx", "TestDB", 0, NULL, 0 )
      == NULL
      )
  {
    fprintf( stderr,
             "Fehler mysql_real_connect():""%u (%s)\n",
             mysql_errno (my),
             mysql_error (my)
             );
  }

  else
  {
    printf("Erfolgreich mit dem MySQL-Server verbunden\n");

    int mysql_ergebnis = mysql_query( my, "SELECT vorname from TestDB_Tab1" );

    if( mysql_ergebnis==0 )
    {
      // SELECT hat geklappt
      // Ergebnisse holen:
      MYSQL_RES *res;
      if( res  = mysql_store_result( my) )
      {
        int ncol = mysql_num_fields( res );
        int nrow = mysql_num_rows( res );
        // Schleife über alle Zeilen:
        for( int iRow=0; iRow<nrow; ++iRow )
        {
          if( ncol!=1 )
          {
            // in meiner Tabelle nur vorname, also
            // sollte nur eine Spalte kommen
            fprintf( stderr, "Fehler: %d Spalten\n", ncol );
          }

          MYSQL_ROW row;
          row = mysql_fetch_row( res );

          printf( "gelesen: (%s)\n", row[0] );
          // NB: bei mehr als 1 Spalte stehen die Strings der weiteren
          // Spalten in row[1], row[2]...
        }
      }
      else
      {
        fprintf( stderr, "Fehler bei mysql_store_result()\n" );
      }
    }
    else
    {
      fprintf( stderr, "Fehler bei mysql_query()\n" );
    }
  }

  return 0;
}
ergibt bei mir:
klaus@i4a:~ > gcc -Wall -std=c99 -I /usr/include/mysql -lmysqlclient t.c && ./a.out
hat geklappt!
Erfolgreich mit dem MySQL-Server verbunden
gelesen: (klaus)
gelesen: (kurt)

(Allerdings mit einem anderen Passwort :-)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Wer wird denn schon nach 3 Stunden aufgeben?

Autor: Eskuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen!

Wie Klaus Wachtler schon schreibt, die Verbindung zur Datenbank stellt 
er erfolgreich her.
Das ist denke ich nicht das Problem.

Meine Frage war, wie ich eine Anfrage (mySQL-Anfrage) erstelle?

Habe nichts Brauchbares im Netz gefunden. Es geht nämlich um folgendes:

Ich möchte in einer Datenbank (namens "TestDB") in einer darin 
enthaltenen Tabelle "TestDB_Tab1" eine bestimmte Zelle (!) auswerten. Es 
wird immer nur diese eine Zelle bleiben, die auszuwerten ist.
Später dann werden aber auch noch einige Daten in eine andere Tabelle 
(TestDB_Tab2) geschrieben, die dann fortlaufend mit Messwerten versehen 
wird.

Nun die Frage: Wie baue ich in mySQL (bzw in der C-API) eine genau 
solche Abfrage?

etwa so von der Logik her
  char sollwert = 100;
  char istwert;

  istwert = abfrage([objekt]);

  if (istwert == 100)
    printf("Der Wert in der Zelle ist 100!");



Autor: Eskuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry...schenkt dem
 char sollwert = 100; 
 in meinem Pseudocode keine Beachtung. Bin noch müde ;-)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eskuel schrieb:
> Meine Frage war, wie ich eine Anfrage (mySQL-Anfrage) erstelle?

Sieht man das nicht an meinem Beispiel?
Da wird ein SELECT-Statement genommen und damit mysql gefüttert,
heraus kommt der Inhalt als String.
Wenn du daraus wiederum eine Zahl brauchst, dann mach doch ein
strtol().

Autor: Eskuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok habe es jetzt geschafft, die eine Zelle auszulesen und per printf() 
auszugeben :)

Hier der Quellcode für Interessierte:


#include <stdio.h>
#include <mysql.h>
#include <errmsg.h>


#define HOSTNAME  "localhost"
#define USER      "root"
#define PASSWD    "xxxx"
#define DB_NAME   "TestDB"
#define TAB_NAME  "TestDB_Tab1"

int main (void)
{
  int anfrage;
  int i;
        char querystring[50];
  unsigned int error;
  MYSQL *my;
  MYSQL_RES *res;
  MYSQL_ROW row;
  my = mysql_init(NULL);
  
  if(my == NULL) 
  {
     printf("Fehler beim Initialisieren \n");
  }
  else
  {
     printf("Initialisierung erfolgreich!\n");  
  }

  if(mysql_real_connect(my,HOSTNAME,USER,PASSWD,DB_NAME,0,NULL,0)== NULL)    // wenn Verbinden nicht erfolgreich
  {
     printf("Fehler mysql_real_connect():""%u (%s)\n",mysql_errno (my), mysql_error (my));
  }

  else
  {
        printf("Erfolgreich mit dem MySQL-Server verbunden\n");
  }

  sprintf(querystring,"select * from %s",TAB_NAME);
  if(mysql_query(my,querystring))              // stelle Anfrage an mySQL-Server
  {
    printf("Anfrage fehlgeschlagen");
  }
  res = mysql_store_result(my);              // liefert bei Ergebnismenge 0
  
  row = mysql_fetch_row(res);              // liefert Datensatz als Array --> row[]

  printf("Der Wert ist %s\n",row[0]);            // Ausgabe des Wertes

  /*
  while((row = mysql_fetch_row(res)))
  {
    for(i=0;i<mysql_num_fields(res);i++)
    {
      printf("%s\n",row[0]);
    }
  }
  */

}


Danke für euere Hilfe!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.