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


von Eskuel (Gast)


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:
1
#include <stdio.h>
2
#include <mysql.h>
3
#include <errmsg.h>
4
5
6
int main (void)
7
{
8
  int anfrage;
9
char sSQL;
10
  unsigned int error;
11
  MYSQL *my;
12
  my = mysql_init(NULL);
13
  if(my == NULL) 
14
  {
15
     fprintf(stderr, "Fehler beim Initialisieren \n");
16
  }
17
  else
18
  {
19
     printf("hat geklappt!\n");  
20
  }
21
22
  if( mysql_real_connect (my,"localhost","root","1234","TestDB",0,NULL,0)== NULL)
23
  {
24
     fprintf (stderr, "Fehler mysql_real_connect():""%u (%s)\n",mysql_errno (my), mysql_error (my));
25
  }
26
27
  else
28
  {
29
        printf("Erfolgreich mit dem MySQL-Server verbunden\n");
30
       
31
  }
32
33
}



Vielen Dank schonmal im Voraus!

von Klaus W. (mfgkw)


Lesenswert?

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

von hp-freund (Gast)


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?

von Klaus W. (mfgkw)


Lesenswert?

1
#include <stdio.h>
2
#include <mysql.h>
3
#include <errmsg.h>
4
5
6
int main (void)
7
{
8
  //int anfrage;
9
  //char sSQL;
10
  //unsigned int error;
11
  MYSQL *my;
12
13
  my = mysql_init(NULL);
14
  if(my == NULL) 
15
  {
16
    fprintf(stderr, "Fehler beim Initialisieren \n");
17
  }
18
  else
19
  {
20
    printf("hat geklappt!\n");
21
  }
22
23
  if( mysql_real_connect( my, "localhost", "root", "xxxx", "TestDB", 0, NULL, 0 )
24
      == NULL
25
      )
26
  {
27
    fprintf( stderr,
28
             "Fehler mysql_real_connect():""%u (%s)\n",
29
             mysql_errno (my),
30
             mysql_error (my)
31
             );
32
  }
33
34
  else
35
  {
36
    printf("Erfolgreich mit dem MySQL-Server verbunden\n");
37
38
    int mysql_ergebnis = mysql_query( my, "SELECT vorname from TestDB_Tab1" );
39
40
    if( mysql_ergebnis==0 )
41
    {
42
      // SELECT hat geklappt
43
      // Ergebnisse holen:
44
      MYSQL_RES *res;
45
      if( res  = mysql_store_result( my) )
46
      {
47
        int ncol = mysql_num_fields( res );
48
        int nrow = mysql_num_rows( res );
49
        // Schleife über alle Zeilen:
50
        for( int iRow=0; iRow<nrow; ++iRow )
51
        {
52
          if( ncol!=1 )
53
          {
54
            // in meiner Tabelle nur vorname, also
55
            // sollte nur eine Spalte kommen
56
            fprintf( stderr, "Fehler: %d Spalten\n", ncol );
57
          }
58
59
          MYSQL_ROW row;
60
          row = mysql_fetch_row( res );
61
62
          printf( "gelesen: (%s)\n", row[0] );
63
          // NB: bei mehr als 1 Spalte stehen die Strings der weiteren
64
          // Spalten in row[1], row[2]...
65
        }
66
      }
67
      else
68
      {
69
        fprintf( stderr, "Fehler bei mysql_store_result()\n" );
70
      }
71
    }
72
    else
73
    {
74
      fprintf( stderr, "Fehler bei mysql_query()\n" );
75
    }
76
  }
77
78
  return 0;
79
}
ergibt bei mir:
1
klaus@i4a:~ > gcc -Wall -std=c99 -I /usr/include/mysql -lmysqlclient t.c && ./a.out
2
hat geklappt!
3
Erfolgreich mit dem MySQL-Server verbunden
4
gelesen: (klaus)
5
gelesen: (kurt)

(Allerdings mit einem anderen Passwort :-)

von Klaus W. (mfgkw)


Lesenswert?

PS: Wer wird denn schon nach 3 Stunden aufgeben?

von Eskuel (Gast)


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
1
  char sollwert = 100;
2
  char istwert;
3
4
  istwert = abfrage([objekt]);
5
6
  if (istwert == 100)
7
    printf("Der Wert in der Zelle ist 100!");

von Eskuel (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


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().

von Eskuel (Gast)


Lesenswert?

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

Hier der Quellcode für Interessierte:
1
#include <stdio.h>
2
#include <mysql.h>
3
#include <errmsg.h>
4
5
6
#define HOSTNAME  "localhost"
7
#define USER      "root"
8
#define PASSWD    "xxxx"
9
#define DB_NAME   "TestDB"
10
#define TAB_NAME  "TestDB_Tab1"
11
12
int main (void)
13
{
14
  int anfrage;
15
  int i;
16
        char querystring[50];
17
  unsigned int error;
18
  MYSQL *my;
19
  MYSQL_RES *res;
20
  MYSQL_ROW row;
21
  my = mysql_init(NULL);
22
  
23
  if(my == NULL) 
24
  {
25
     printf("Fehler beim Initialisieren \n");
26
  }
27
  else
28
  {
29
     printf("Initialisierung erfolgreich!\n");  
30
  }
31
32
  if(mysql_real_connect(my,HOSTNAME,USER,PASSWD,DB_NAME,0,NULL,0)== NULL)    // wenn Verbinden nicht erfolgreich
33
  {
34
     printf("Fehler mysql_real_connect():""%u (%s)\n",mysql_errno (my), mysql_error (my));
35
  }
36
37
  else
38
  {
39
        printf("Erfolgreich mit dem MySQL-Server verbunden\n");
40
  }
41
42
  sprintf(querystring,"select * from %s",TAB_NAME);
43
  if(mysql_query(my,querystring))              // stelle Anfrage an mySQL-Server
44
  {
45
    printf("Anfrage fehlgeschlagen");
46
  }
47
  res = mysql_store_result(my);              // liefert bei Ergebnismenge 0
48
  
49
  row = mysql_fetch_row(res);              // liefert Datensatz als Array --> row[]
50
51
  printf("Der Wert ist %s\n",row[0]);            // Ausgabe des Wertes
52
53
  /*
54
  while((row = mysql_fetch_row(res)))
55
  {
56
    for(i=0;i<mysql_num_fields(res);i++)
57
    {
58
      printf("%s\n",row[0]);
59
    }
60
  }
61
  */
62
63
}


Danke für euere Hilfe!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.