Fehler beim Zugriff auf mySQL-Datenbank



  • Hallo Leute!

    Dank der Suche hier im Forum klappt das Programm erstmal. Ich hab noch nichteinmal die vielen Warnungen bekommen, von denen hier die Rede war. Also null Warnungen und Null Fehler beim Compilieren.
    Wenn das Programm aber dann läuft bekomm ich nen Systemfehler. Der Einsprungpunkt in die DLL wird nicht gefunden, was mach ich falsch.

    Ich hab folgenden Code von der MySQL-Seite ausprobiert:

    Connection con("Bla","","Blub","Bla"); 
    
      Query query = con.query(); 
    
      query << "select Name from UserTest"; 
    
      Result res = query.store(); 
    
      cout << "Query: " << query.preview() << endl; 
    
      cout << "Records Found: " << res.size() << endl << endl; 
    
      Row row; 
      cout.setf(ios::left); 
      cout << "Name" << endl; 
    
      Result::iterator i; 
      for (i = res.begin(); i != res.end(); i++) { 
        row = *i; 
        cout << row[0] << row["Name"] << endl;
      } 
      return 0;
    

    Wenn es an was anderem liegt, z.B. an der Einbindung der DLL wäre ich dankbar.

    Danke, Ranger



  • Und was sind das für Klassen. Sollen wir jetzt raten ?



  • Also, ich hab den Code von der MySQl Seite, also sind es Klassen aus der libmysql.dll. Wie gesagt, nach der Anleitung eingebunden und den auf dieser Seite veröffentlichten Quellcode benutzt. Wenn ich das alles compilier und linke, dan geht es nur während der Laufzeit steigt er aus.

    schonmal Dank



  • Die libmysql.dll exportiert keine Klassen sondern die API.



  • was passiert denn da genau? was heiss er steigt aus? was für eine meldung kommt? wo hält er an? debug oder release? beide probiert? wie sieh der code aus?

    hellsehen können wir hier nicht!



  • Ich nehm die mysql++ von besagter Seite, da wird doch sicherlich die libmysql dahinter liegen.

    Fehlermeldung:

    der Prozedureinsprungpungt von "mysql_connect" kann in der Bibliothek LIBMYSQL.dll nicht gefunden werden.

    Diese Funktion selbst rufe ich nicht, also nehm ich an sie wird im Hintergrund also intern gerufen.

    Muss ich die DLL wirklich noch laden? er weis ja aber anscheinend, wo er hin muss, findet aber netsprechende Stelle nicht.

    Danke



  • schau dir einfach mal das beispiel an, das dabei ist... dort binden sie die libs korrekt ein, also linken sie korrekt mit, da kann man es sich abschaun.

    mach am besten noch einen try catch block drum.. so wie im mitgelieferten beispiel:

    #include <iostream>
    #include <iomanip>
    #include <mysql++>
    
    int main() {
      // The full format for the Connection constructor is
      // Connection(cchar *db, cchar *host="", 
      //            cchar *user="", cchar *passwd="") 
      // You may need to specify some of them if the database is not on
      // the local machine or you database username is not the same as your
      // login name, etc..
      try {
    
          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
    
    		cout << "Query: " << query.preview() << endl;
    		// Query::preview() simply returns a string with the current query
    		// string in it.
    
    		cout << "Records Found: " << res.size() << endl << endl;
    
    		Row row;
    		cout.setf(ios::left);
    		cout << setw(17) << "Item" 
    			<< setw(4)  << "Num"
    			<< setw(7)  << "Weight"
    			<< setw(7)  << "Price" 
    			<< "Date" << endl
    			<< endl;
    
    		Result::iterator i;
    		// The Result class has a read-only Random Access Iterator
    		for (i = res.begin(); i != res.end(); i++) {
    			row = *i;
    			cout << setw(17) << row[0] 
    				<< setw(4)  << row[1] 
    				<< setw(7)  << row["weight"]
    				// you can use either the index number or column name when
    				// retrieving the colume data as demonstrated above.
    				<< setw(7)  << row[3]
    				<< row[4] << endl;
    		}
      } catch (BadQuery er){ // handle any connection 
                             // or query errors that may come up
        cerr << "Error: " << er.error <<  endl;
        return -1;
    
      } catch (BadConversion er) {
        // we still need to cache bad conversions incase something goes 
        // wrong when the data is converted into stock
        cerr << "Error: Tried to convert \"" << er.data << "\" to a \""
    	 << er.type_name << "\"." << endl;
        return -1;
      }
    	return 0;
    }
    


  • ich nehm mal an du arbeitest unter windows ...

    die classen sind von mysql++, also nicht vom mysql c-api.
    die lib fuer mysql++ duerft die sqlplus.lib ??? sein ... (die benutzt aber die mysql c-api).
    die libmysqlclient.lib solltest trotzdem auch linken, weil die dir die dynamische lib laed . (mach ich ungern selber)

    Sie können Ihren Code entweder mit der dynamischen `libmysql.lib'-Bibliothek linken, die nur ein Wrapper zum Laden der `libmysql.dll' bei Bedarf ist, oder mit der statischen `mysqlclient.lib'-Bibliothek.

    ganz wichtig !!!

    Beachten Sie, dass MySQL-Client-Bibliotheken als threaded Bibliotheken kompiliert werden, daher sollten Sie auch Ihren Code so kompilieren, dass er multi-threaded ist!

    und in deinem Project sollte auch das Exceptionhandling aktiviert sein (ist meistens schon) !!!

    Ciao ...



  • CMYSQLDatabase m_databaseconnect;
    
    	if (m_databaseconnect.connected == false)
    	{
    		switch (m_databaseconnect.connect(m_dbhost,m_dbdatenbank,3306,m_dbuser,m_dbpassw))
    		{
    			case DB_CONNECTION_BAD:
    			return false;
    
    			case DB_CONNECTION_OK:
    			break;
    		}
    
    	}
    
    	CString commando = "SELECT id,feld2 FROM testtable";
    	switch (m_databaseconnect.sqlexecute(commando))
    	{
    		case DB_COMMAND_ERROR:
    
    		return false;
    
    		case DB_COMMAND_OK:
    		// INSERT,UPDATE,DELETE OK		
    
    			return false;
    		case DB_EMPTY_QUERY:
    			// SELECT liefert keine Daten
    		return false;
    		case DB_SELECT_OK:
    		// Erster Datensatz: Der Inhalt ist in  m_databaseconnect.field[1]  m_databaseconnect.field[2]
    		break;
    	}
    
    	for (UINT x = 1;x < m_databaseconnect.nrdaten();x++)
    	{
    		switch(m_databaseconnect.fetch())
    		{
    			case DB_FETCH_OK:
    				// Nächster Datensatz: Der Inhalt ist in  m_databaseconnect.field[1]  m_databaseconnect.field[2]
    			break;
    
    			case DB_FETCH_EMPTY:
    
    			return true;
    		}
    	}
    

    Hier mal ein Bsp. für meine Klasse. Ohne Errors oder sonstigem.



  • DA hab ich anscheinend die falsche DLL eingebunden. Ich werd das alles nochmal nach den Gesichtspunten abarbeiten.

    Vielen Dank

    Ranger



  • Hallo Leute!

    Wie gesagt hab ich es versucht mit den anderen Bibliotheken. Kompilieren astrein, aber beim Linken spuckt er folgendes aus:

    **
    LINK : warning LNK4098: Standardbibliothek "MSVCRT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden
    **
    Was will mir dieses Meldung mitteilen, abgesehen von dem was da steht? 🙂

    Ach ja, es gibt mehrere Arten der multithreaded Compilierung, welche sollte ich nehmen?
    **
    multithreaded
    multithreaded debuggen
    multithreaded dll
    multithreaded dll debuggen
    **

    Danke


Anmelden zum Antworten