Announcement

Collapse
No announcement yet.

MYSQL Datenbankabfrage mit C++Builder

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MYSQL Datenbankabfrage mit C++Builder

    Hallo Ihr,
    schon länger bin ich in eurem Forum als Gast unterwegs und es hat mir auch in den meisten Fällen geholfen. Leider diesmal nicht 100%ig.

    Also wie im Titel schon steht möchte ich ein Programm schreiben um Daten aus einer MYSQL Tabelle auszulesen. Diese möchte ich dann nachher ausgeben (Editfeld). Das Programm möchte ich dann später im Netz zum Download anbieten, sprich es sollte standalone fähig sein, damit scheidet schon eine Lösung via ODBC aus (denke ich).

    Nun versuche ich schon ein Weilchen das mit den dbexpress Komponenten zum Laufen zu bringen. Die TSQLConnection steht auch schon.

    Folgenden (wohl fehlerhaften) Code verwende ich im Moment:
    Code:
    SQLConnection1->Connected = true;
    SQLQuery1->SQL->Clear();
    SQLQuery1->SQL->Add("SELECT * FROM t_wetter;");
    SQLQuery1->Open();
    AnsiString tt = SQLQuery1->FieldByName("datum")->AsString;
    Label15->Caption=tt;
    Mit diesem bekomme ich nämlich folgende Fehlermeldung beim Klicken des Buttons mit dem o.g. Code:



    Meine Fragen wären dazu:

    1) Ist es überhaupt möglich mit den dbexpress Komponenten ein standalone Programm zu programmieren das ohne irgendwelche Einwände auf anderen Rechner läuft?

    2) Wenn 1 mit ja beantwortet werden kann: Wie kann ich den Fehler beheben?
    3) Wenn 1 mit nein beantwortet wird: Wie könnte ich die Abfrage mit meinem C Programm anders lösen?

    Ich hoffe Ihr könnt mir helfen...

    Danke euch im Voraus

    Gruß Nickbw2003

  • #2
    Wenn du kein ODBC nutzen willst, kannst du keine Komponenten nutzen.Diese nutzen m.E. ODBC Verbindungen.

    Du sollstes dir MySQL so installieren, dass die entsprechenden C/C++ API mit installiert wird, und dann die DB "nativ" programmieren

    Siehe hier

    http://www.marquardtnet.info/cecke/t...8/8_mysql.html

    (siehe Hinweise unter Installation und Links zu den APIs)

    Hinsichtlich deines Fehlers:

    Debugge dein Programm und stelle so die Zeile fest, an der dieser Fehler auftritt.


    Wie willst du ohnehin dein Programm weitergeben?? MySQL ist eine Server DB. Willst du MySQL selbst auf dem Zielsystem installieren? Wenn nein, wie sollte der Nutzer dann die DB einrichten? Siehe obigen Link.

    Vielleicht solltest du eine DB wie SQLlLite benutzen. Dies ist eine "standalone" DB, allerdings ohne Datentypen wie TIME, DATE oder TIMEDATE.
    Christian

    Comment


    • #3
      Ich vermute das die gefundene libmysql.dll nicht zu der verwendeten dbExpress-Version passt. Diese darfst du für komerzielle Programme nicht mitverteilen da du sonst in die GPL-Falle von MySQL läufst (Entweder programm ist Open Source oder für jede Verteilung fallen MySQL-Lizenzen an.

      Ich empfehle für MySQL Komponenten von Core Labs. Diese kommen ohne Libmysql.dll aus und haben damit einige Verteilungs/Versionsprobleme weniger.

      Comment


      • #4
        Ich habe mich jetzt entschieden die MYSQL C API zu verwenden.
        Habe die beiliegende libmysql.lib in eine omf umgewandelt. Und diese im Borland C++ Builder mit "Datei zum Projekt hinzufügen" eingebunden. Ich weiß nicht ob es wichtig ist, aber ich habe die libmysql2.lib danach in den Unterordner Lib des Borland Ordners kopiert.
        Danach habe ich die mysql.h mit folgender Zeile eingebunden:

        Code:
        #include "c:\\programme\mysql\\mysql server 5.1\\include\\mysql.h"
        Leider bekomme ich jetzt aber folgende Fehler die ich mithilfe von google nicht ausmerzen kann:



        und:



        Ich hoffe Ihr könnt mir helfen, bin schon seit 3 Stunden mit der Lösung beschäftigt...schaffe es aber leider nicht...

        Comment


        • #5
          include "winsock2.h"
          hinzufügen
          Christian

          Comment


          • #6
            Danke Dir Christian.

            Habe mir jetzt schon mehrere Beispielclients im Netz angeschaut. Leider sind alle die ich bis jetzt gefunden habe konsolenbasierend. Jetzt bin ich gerade dabei eines davon umzuschreiben.

            Code:
            MYSQL        *connection;    /* Der MySQL-Handler: Verbindung zum MySQL-Server */
                MYSQL_RES    *ergebnis;    /* Ergebnis einer Abfrage */
                char        abfrage[1000];    /* beinhaltet die Abfrage */
                MYSQL_ROW    zeile;        /* Ergebniszeile */
                int         anz;        /* Anzahl der Zeilen */
                int         i;
            
                connection = mysql_init(NULL);        /* Datenstruktur initalisieren */
            
                if(mysql_real_connect(            /* Verbindung aufbauen */
                    connection,            /* MySQL-Handler */
                    "localhost",            /* Host-Name */
                    "root",            /* User-Name */
                    "katalog21",        /* Passwort  */
                    "wetterdaten",        /* Datenbank */
                    0,                /* Port, standard = 0 */
                    NULL,                /* Socket, standard = NULL */
                    0) == NULL) {            /* keine Flags */
                        Label14->Caption="Verbindung schlug fehl: %u (%s)", mysql_errno(connection), mysql_error(connection);
                        Label14->Visible=true;
                        mysql_close(connection);
                        exit(1);
                    }
            
                sprintf(abfrage, "SELECT * FROM t_wetter;");
            
                if((mysql_query(connection, abfrage) != 0)) {     /* SQL-Befehl ausführen */
                    Label14->Caption="Abfrage schlug fehl: %u (%s)", mysql_errno(connection), mysql_error(connection);
                    Label14->Visible=true;
                    mysql_close(connection);
                    exit(1);
                }
            
                ergebnis = mysql_store_result(connection);    /* Ergebnisse speichern */
            
                Memo1->Text=ergebnis;
            Kommt das bis jetzt so hin?

            Bei der letzten Zeile taucht ein Fehler auf. Ich denke es hat mit dem Datentyp zu tun, weiß aber nicht wie ich das lösen kann:

            Code:
            [C++ Fehler] Wetter.cpp(146): E2034 Konvertierung von 'st_mysql_res *' nach 'AnsiString' nicht möglich
            Außerdem erhalte ich noch diese Warnung:

            Code:
            [C++ Warnung] Wetter.cpp(148): W8004 'ergebnis' wurde ein Wert zugewiesen, der nie verwendet wird
            Stimmt der Quelltext soweit mit Ausnahme der 2 Fehlermeldungen und wie kann ich diese beheben?

            Comment


            • #7
              WARNUNG 2 rührt daher, dass Fehler 1 auftritt. Es ist eine Warnung kein Fehler.

              Das

              MYSQL_RES *ergebnis;

              kann keinem String zugewiesen werden. Da musst du in die MySQL Doku schauen, was das ist und wie es zu interpretieren ist.

              Ich nutze MySQL nicht so.....mit ODBC
              Christian

              Comment


              • #8
                Ich habs jetzt hinbekommen. Was ich noch hinbekommen möchte ist, dass ich anstatt des Datums im select:

                Code:
                sprintf(abfrage, "SELECT * FROM t_wetter where datum='01.01.2008;");
                eine Variable habe in der das Datum steht. Dieses Datum wird aus einem Editfeld geholt und in die Variable gespeichert. Man gibt praktisch das Datum in ein Editfeld ein, das Datum wird gespeichert und mithilfe des selects werden dann die dem Datum zugehörigen Werte ausgelesen.

                Editfeld (Eingabe Datum) ->Variable (gespeicherte Eingabe des Datums) -> select mit Variable (Datum)

                Die Variable habe ich schon deklariert und zwar so:
                Code:
                AnsiString Datum;
                
                Datum=Edit7->Text; //Eingabe von Edit7 an Variable Datum zuweisen
                Wie schaffe ich es jetzt das ganze in dieser Zeile so zu ändern, dass das funktioniert?

                Code:
                sprintf(abfrage, "SELECT * FROM t_wetter where datum='01.01.2008;");
                Zuletzt editiert von nickbw2003; 04.02.2008, 16:13.

                Comment


                • #9
                  In dem du den SELECT erst in einem String zusammenbastelst:

                  String sel="SELECT * FROM t_wetter where datum='"+edit7->Text+"01.01.2008'";

                  sprintf(abfrage,sel.c_str());

                  Solltest natürlich darauf achten, dass die Eingabe geprüft ist, sont gibts einen DB-Fehler.
                  Christian

                  Comment


                  • #10
                    Danke nochmal Christian.

                    Der Abruf funktioniert jetzt zumindest von localhost aus mit einer Testdatenbank.
                    Hier mal mein Code zum Abruf:

                    Code:
                    void __fastcall TForm1::Button2Click(TObject *Sender)
                    {
                    /*############################################################################*/
                    /*###########################  Verbindungsdaten  #############################*/
                    /*############################################################################*/
                    
                        MYSQL       *connection;                    /* Der MySQL-Handler: Verbindung zum MySQL-Server */
                        MYSQL_RES   *ergebnis,*ergebnis2;           /* Ergebnis einer Abfrage */
                        char        abfrage[1000],abfrage2[1000];   /* beinhaltet die Abfrage */
                        MYSQL_ROW   zeile,zeile2;                   /* Ergebniszeile */
                    
                        connection = mysql_init(NULL);              /* Datenstruktur initalisieren */
                    
                        if(mysql_real_connect(                      /* Verbindung aufbauen */
                        connection,                                 /* MySQL-Handler */
                        "localhost",                                /* Host-Name */
                        "wetterabruf",                                     /* User-Name */
                        "nichtvonbedeutung",                                /* Passwort  */
                        "wetterdaten",                              /* Datenbank */
                        3306,                                          /* Port, standard = 0 */
                        NULL,                                       /* Socket, standard = NULL */
                            0) == NULL) {                           /* keine Flags */
                                Label14->Caption="Verbindung schlug fehl: %u (%s)", mysql_errno(connection), mysql_error(connection);
                                Label14->Visible=true;
                                mysql_close(connection);
                                exit(1);
                            }
                    
                    /*############################################################################*/
                    /*############################################################################*/
                    
                    
                    /*############################################################################*/
                    /*###########################  Abruf Heilbronn  ##############################*/
                    /*############################################################################*/
                    
                    String sel1="SELECT * FROM t_wetter where datum='"+Edit7->Text+"' and ort='HN';";
                    
                        if((mysql_query(connection, sel1.c_str()) != 0)) {       /* SQL-Befehl ausführen */
                            Label14->Caption="Abfrage schlug fehl: %u (%s)", mysql_errno(connection), mysql_error(connection);
                            Label14->Visible=true;
                            mysql_close(connection);
                            exit(1);
                        }
                    
                        ergebnis = mysql_store_result(connection);          /* Ergebnisse speichern */
                    
                    /*############################################################################*/
                    /*############################################################################*/
                    
                    
                    /*############################################################################*/
                    /*##########################  Abruf Port Talbot  #############################*/
                    /*############################################################################*/
                    
                    String sel2="SELECT * FROM t_wetter where datum='"+Edit7->Text+"' and ort='PT';";
                    
                        if((mysql_query(connection, sel2.c_str()) != 0)) {     /* SQL-Befehl ausführen */
                            Label14->Caption="Abfrage schlug fehl: %u (%s)", mysql_errno(connection), mysql_error(connection);
                            Label14->Visible=true;
                            mysql_close(connection);
                            exit(1);
                        }
                    
                        ergebnis2 = mysql_store_result(connection);    /* Ergebnisse speichern */
                    
                    /*############################################################################*/
                    /*############################################################################*/
                    
                    
                    /*############################################################################*/
                    /*#############################  Ausgabe Heilbronn  ##########################*/
                    /*############################################################################*/
                    
                    //Komponenten verstecken/anzeigen
                        Panel2->Visible=false;
                        Label8->Caption="Weather conditions of";
                        Panel4->Visible=true;
                        Panel1->Visible=false;
                        Label15->Visible=true;
                        Label16->Visible=true;
                    
                        while(zeile = mysql_fetch_row(ergebnis))
                            {
                                            Label15->Caption=zeile[0];
                                            Edit1->Text=zeile[1]; /* Zeilen ausgeben */
                                            Edit2->Text=zeile[2];
                                            Edit3->Text=zeile[3];
                            }
                    
                    /*############################################################################*/
                    /*############################################################################*/
                    
                    
                    /*############################################################################*/
                    /*############################  Ausgabe Port Talbot  #########################*/
                    /*############################################################################*/
                    
                        while(zeile2 = mysql_fetch_row(ergebnis2))
                            {
                                            Edit4->Text=zeile2[1]; /* Zeilen ausgeben */
                                            Edit5->Text=zeile2[2];
                                            Edit6->Text=zeile2[3];
                            }
                    
                    /*############################################################################*/
                    /*############################################################################*/
                    }
                    Jetzt wollte ich aber das ganze übers lokale Netzwerk testen. Habe also die Zeile:

                    Code:
                    "localhost",                                /* Host-Name */
                    so bearbeitet:

                    Code:
                    "192.168.10.251",                                /* Host-Name */
                    Das Programm beendet sich aber nach dem Klicken des Buttons sofort von selbst.

                    Der user hat eine Wildcard für host (in der datenbank "mysql" tabelle "user" ein % eingetragen). Ich hab alles mögliche schon probiert, so z.B. auch die Einträge in der my.conf.

                    Woran könnte es eurer Meinung nach liegen?

                    //Edit:
                    Hat sich erledigt. Habe den Server nicht neugestartet gehabt....
                    Zuletzt editiert von nickbw2003; 05.02.2008, 14:07.

                    Comment

                    Working...
                    X