Hilfe!! MySQL++ und VCL Anwendung
-
guten abend,
ich experementiere gerade etwas mit dem bcb und der mysql++ Bibliothek rum. Dafür habe ich mir extra die an den bcb6 angepasste bibliothek runtergeladen ( http://www.mysql.com/downloads/api-mysql++.html ). Dann hab ich nen beiligendes Beispielprogramm leich modifiziert und alle libs eingebunden, die bei dem Packet dabei waren. Das ganze hat kompiliert perfekt funktioniert und so sieht so aus:
#include <windows.h> #include <iostream> #include <iomanip> #include <sqlplus.hh> int main() { Connection con("mysql_cpp_data"); Query query = con.query(); // This creates a query object that is bound to con. query << "select * from stock"; // You can write to the query object like you would any other ostrem Result res = query.store(); return 0; }
Gut, hab ich mir dann gedacht. Scheint ja alles zu funktionieren, dann werd ich ans eingemachte gehen. Sofort hab ich ne normale Anwendung erstellt (also VCL mit Form) und nen Button draufgemacht -> Doppelklick und den Code oben aus mein eingefügt. Zur Sicherheit auch alle Header. Libs und Includes genauso wie oben. Das sieht dann so aus:
//--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #include <iostream> #include <iomanip> #include <sqlplus.hh> #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Connection con("mysql_cpp_data"); Query query = con.query(); // This creates a query object that is bound to con. query << "select * from stock"; // You can write to the query object like you would any other ostrem Result res = query.store(); // Query::store() executes the query and returns the results } //---------------------------------------------------------------------------
Und wenn ich jetzt kompilieren will, kommt der Punkt der mir unbegreiflich ist:
[Linker Fehler] Unresolved external '_mysql_num_rows' referenced from UNIT1.OBJ
[Linker Fehler] Unresolved external '_mysql_num_fields' referenced from UNIT1.OBJ
[Linker Fehler] Unresolved external '_mysql_data_seek' referenced from UNIT1.OBJIch kapier einfach nicht wieso, ich includier die selben Verzeichnisse wie oben bzw. binde auch die selben Libs ein. Und wenn ich absichtlich ne lib (z.B.mysqlplus.lib) weglasse, kommen um einiges mehr Fehler. Aber wieso diese drei??
Das Problem beschäftigt mich schon seit Stunden, bitte helft mir, ich verzweifel hier sonst noch völlig.
Vielen Dank schon mal im VorrausStefan
-
Vermutlich nutzt der Linker noch veraltete Objektdateien. Am besten löschen und neu compilieren lassen.
-
ach wenn es nur so einfach wäre.......
ich hab das Projekt schon mehrmals neu erstellt und auch die objektdateien öfters gelöscht, alles vergeblich.
-
juhuu... ich habs!!!!!!!!!!
Es lag daran, dass der VCL header über dem Windows header stand, steht der windows header über dem vcl header läuft alles perfekt!!!!
Puhh... das war ne wirklch schwere geburt!!
-
Bist du sicher, dass du windows.h explizit einbinden musst? Zumindest in neueren Versioenen des BCB (4+ ?) wird das implizit über die vcl.h erledigt.
-
Ja, muss ich schon, sonst bekomme ich den oben erwähnten Linker Fehler.
Aus der Readme:1. You should always include <windows.h> in your cpp files.
Hätte da auch gestanden, wo genau die windows.h hinkommen soll, hätte ich mir viele schwere Stunden erspart. Vieleicht schick ich dem Ersteller dieses Packets mal ne Mail deshalb.
-
was mach ich noch falsch? Mein Source sieht folgendermassen aus:
#include <windows.h> #include <vcl.h> #pragma hdrstop #include <iostream> #include <iomanip> #include <sqlplus.hh> #include "main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "GenEng" #pragma link "HttpEng" #pragma resource "*.dfm" TDataModule2 *DataModule2; //--------------------------------------------------------------------------- __fastcall TDataModule2::TDataModule2(TComponent* Owner) : TDataModule(Owner) { } int DBConnecten() { Connection con("mysql_cpp_data"); Query query = con.query(); return 0; } //--------------------------------------------------------------------------- void __fastcall TDataModule2::GeneralHttpEngine1ExecRequest( TObject *Sender) { DBConnecten(); } //---------------------------------------------------------------------------
Das ganze soll eine CGI-Anwendung werden. Deshalb habe ich ein Datamodul und benutze die CGIExpert-componenten in der Freeware-Version (6.5.x)
Die Fehlermeldung, die ich bekomme lautet:[Linker Fehler] Unresolved external 'MysqlConnection::~MysqlConnection()' referenced from E:\JENS\CPLUSPLUS\ZWISCHENAUSGABE\MAIN.OBJ
Ich habe mir die Beispiele die dabei waren auch angesehen und alle Verzeichnisse eingebunden und verglichen mit den Beispielen. Die Beispiele lassen sich linken, mein Source nicht.
Habe auch schon die Main.obj gelöscht.
Bitte! Helft mir. Ich komme nicht mehr weiter. Habe schon tausend verschiedene Dinge versucht und Stundenlang im Web nach Hilfe gesucht.
-
So, habe den Fehler gefunden. Ich musste die lib-Dateien explizit zu dem Projekt hinzufügen. In meinem Fall war das die libmysql.lib und die msylplus.lib
Jedenfalls lässt sich das ganze jetzt linken.
-
[edit]
Ich weiss nicht genau, was jetzt anders ist, aber nach einer Neustrukturierung des Codes - modularer Aufbau - funktioniert das ganze jetzt.
[/edit]Hallo ich habe jetzt zum Testen aus folgendem Code Teile rausgezogen und bei mir eingebaut:
int main (int argc, char *argv[]) { MYSQL *my; /* Handle initialisieren */ my = mysql_init(NULL); if(my == NULL) { fprintf(stderr, " Initialisierung fehlgeschlagen\n"); exit (0); } /* Mit dem Server verbinden */ if( mysql_real_connect ( my, /* Zeiger auf MYSQL-Handler*/ NULL, /* Host-Name*/ NULL, /* User-Name*/ NULL, /* Passwort für user_name */ NULL, /* Name der Datenbank*/ 0, /* Port (default=0) */ NULL, /* Socket (default=NULL)*/ 0 /* keine Flags */ ) == 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"); /* Hier befindet sich der Code für die Arbeit mit MySQL */ /* Verbindung trennen */ mysql_close (my); return 0; }
Gefunden habe ich den code unter http://www.pronix.de/C/standard_C/c_programmierung_28_2.shtml#4
Klappt auch alles wunder bar, wenn ich aber versuche mit mysql_close (my); die verbindung zu beenden bekomme ich eine Fehlermeldung. Ich lasse mir die CGI-Ausgabe in einem Memo einer 2.Anwendung anzeigen und bekomme folgendes:
<html><body>Unhandled Exception: Zugriffsverletzung bei Adresse 10007D03 in Modul 'LIBMYSQL.DLL'. Lesen von Adresse 00000013</body></html>
wenn ich mysql_close auskommentiere bekomme ich die Daten angezeigt, die ich haben wollte. Habe zu Testzwecken einfach immer mal wieder ein
PutLine("Debugpunkt");
eingefügt
Da ich MySQL local auf meinem Rechner installiert habe, habe ich auch schon versucht, die DLL auszutauschen. Mit dem Effekt, dass bei einer anderen DLL (neueres Datum) schon eine Zugriffsverletzung kommt, auch wenn ich mysql_close nicht benutze.Kann mir jemand helfen? Im Zweifelsfall lass ich das close einfach weg, was ich aber nicht für so ideal finde.