VC++ und mysql



  • Hallo, mein Programm greift über den mysql-c-Wrapper von mysql auf eine mysql Datenbank... Solange ich für jede Anfrage mich an- und abmelde läuft alles gut...
    Jetzt wollte ich so machen dass das Programm sich nur beim starten anmeldet und am Ende von der Datenbank abmeldet und es klappt nicht mehr...

    Ich meine folgendes:

    Datenbank.h

    ...
    
    public:
        MYSQL DB;
    ...
    

    Datenbank.cpp

    BOOL Datenbank::Anmelden()
    {
    	mysql_init(&DB);
    	if (!mysql_real_connect(&DB,m_DB_sHost,m_DB_sBenutzer,m_DB_sPasswort,"DB",0,NULL,0))
    	        return FALSE;
    	else
    		return TRUE;
    }
    

    MainFrm.cpp

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    ...
    Datenbank.Anmelden();  // Kein Problem... Alles OK!
    ..}
    

    irgendeinandereklasse.cpp

    ...
    mysql_query(&Datenbank.DB,"SELECT * FROM DB.Tabelle") //das Klappt nicht!
    //DB ist auf einmal leer und mein Log Datei meldet "Commands out of sync;  You can't run this command now"
    
    // rufe ich auch hier vor der Query Anfrage Datenbank.Anmelden() auf, läuft alles perfekt...
    ...
    

    Was mache ich falsch???

    Danke schon mal im voraus...



  • MYSQL *DB;
    
    DB= mysql_init(NULL);
    
    mysql_query(DB,
    


  • Danke Unix-Tom, ich werde es ausprobieren...



  • Irgendwie funktioniert es nicht...
    ich habe das jetzt zu folgendes geändert...

    Datenbank.h

    ...
    
    public:
        MYSQL *DB;
    ...
    

    Datenbank.cpp

    BOOL Datenbank::Anmelden()
    {
        DB = mysql_init(NULL);
        if (!mysql_real_connect(DB,m_DB_sHost,m_DB_sBenutzer,m_DB_sPasswort,"DB",0,NULL,0))
                return FALSE;
        else
            return TRUE;
    }
    

    irgendwo.cpp

    ...
    mysql_query(Datenbank.DB,"SELECT * FROM DB.Tabelle") //will irgendwie nicht!!!
      //Der Kompiler meldet eine Zugriffsverletzung und DB ist leer!!!
      //Die Verbindung steht trotzdem, da ich mysql_close(DB) noch nicht aufgerufen habe...
      // schreibe ich Datenbank.DB = mysql_init(NULL) vor mysql_query(...) , meldet der kompiler keine Fehler mehr aber in mein Logdatei steht "MySQL server has gone away"...
    ...
    


  • hast du anmelden schonmal aufgerufen?



  • sicher 😉
    steht weiter oben... direkt am Anfang meines Programms...

    MainFrm.cpp

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    ...
    Datenbank.Anmelden();  // Kein Problem... Alles OK!
    ..}
    

    Es läuft auch, da ich nach Benutzerdaten abfrage, mich mit den Daten anmelde und was in der Datenbank sachreibe...



  • Wie schon oben beschrieben, solange ich mich bei jeder Abfrage in der Datenbank anmelde und danach wieder abmelde, funktioniert alles zu 100%...



  • musst du nicht nach jeder Transaktion explizit besagte schließen?
    Nur mal so als Idee



  • Mysql hat doch standardmäßig keine Transaktionen. Die gibts erst bei InnoDB und das muss man aktivieren...



  • Es kann sein das du Datenbank.DB nicht aus deinem aktiven Dialog holst.

    Du hast IMHO ein include deines Dialoges in deinem 2ten. deshalb besteht Datenbank.DB dort auch. aber es nicht nicht der Zeiger aus deinem aktiven Dialog



  • Um es dir einfacher zu machen kannst du ja auch mal auf meine WS schauen.



  • Danke an alle...
    Also Datenbank.cpp ist nur eine Klasse wo verschiedene Routinen stehen...
    Am Anfang meines MDI-Programms wollte ich die Datenbankverbindung starten... Dann habe ich verschiedene Dialogen, die ich aufrufe, wo ich halt verschiedene Querys starte... Am Ende, bevor ich das Programm beende, wollte ich die Verbindung wieder schließen...

    Ich hatte mir das so vorgestellt:

    MainFrm.cpp(hauptdatei des Programms) greift auf Datenbank.cpp (verschiedene Datenbank-Routinen) und meldet sich bei der Datenbank an...
    Alle Dialogs, die jetzt aufgerufen werden, holen sich DB von der Datenbank.cpp und führen mysql_query(...) aus (hier klappt es nicht, DB ist leer)...
    Am Ende bei aufrufen von void CMainFrame::OnClose() wird dann mysql_close(DB) aufgerufen...

    @Unix-Tom: ich hole deshalb Datenbank.DB aus eine Datenbankroutine und nicht aus ein Dialog...

    Sorry, aber irgendwie weiß ich nicht genau ob ich dich verstanden habe...

    Meine Frage ist nun ob ich irgendwo ein Denkfehler habe...
    Polofreak sprach von Transaktion schließen... Habe ich da was übersehen?
    Also, immer wenn ich ein Datenmenge zurückbekomme nehme ich result = mysql_use_result(DB) und am Ende mysql_free_result(result)...
    Bei selects mache ich aber so was nicht, da ich keine Datenmenge nutze...

    Danke schon mal im Voraus...
    Ich hoffe ist alles Verständlich was ich geschrieben habe...



  • Schau mal auf meine Website.


Anmelden zum Antworten