简体   繁体   中英

Crash using a class using mysql lib with wxWidgets

I've been stuck for a while on a problem and can't find a good solution.

I wrote a small class to use the c mysql lib on my project.

I use this class from an other class, the compilation goes well, but when i call it the software crash.

I believe that i'm doing something wrong but I can't find what. Maybe some advanced ppl will know.

Sql class:

class MySQL
{
public:
    MySQL();
    ~MySQL();

    bool  Query(wxString Qu, MYSQL_RES * result);
    unsigned int Insert(wxString Table);
    bool Update(wxString Table, unsigned int Id, wxString Data);
    bool Delete(wxString Table, unsigned int Id);
protected:
private:
    void Close(void);
    bool Open(void);
    MYSQL mysql;
};

Sql function:

bool  MySQL::Query(wxString Qu, MYSQL_RES * result)
{
   //Qu.mb_str()
   if (this->Open()) {
      if (!mysql_query(&mysql, "jkjl")) {  //<--- I've replaced the Qu var to be sure it wasn't the reason.
         if ((result = mysql_store_result(&mysql))) {
                this->Close();
         } 
         else {
                //throw wxString::Format(wxT("Error: %i, %s"),  mysql_errno(&mysql), mysql_error(&mysql));
                this->Close();
         }

       } 
       else {
            //throw wxString::Format(wxT("Error: %i, %s"),  mysql_errno(&mysql), mysql_error(&mysql));
            this->Close();
       }
    }
    return true;
}

My other class to access to:

bool cldataproject::Load(std::list<cldataproject*> list_dataproject)
{
    MySQL sql;
    MYSQL_RES *result = NULL;
    MYSQL_ROW row = NULL;
    unsigned int  pos;
    cldataproject * list_project;
    wxString req;
    req = wxT("SELECT idproject, idclient, name, comment,  created_by, created_at, modified_by, modified_at FROM project  WHERE isdel=0 ORDER BY name ASC;");
    if ((sql.Query(req, result)))  // <--- Crash
    {
......

Open function:

bool MySQL::Open(void)
{
    mysql_init(&mysql);
    mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");
    if(mysql_real_connect(&mysql,MYSQL_HOST,MYSQL_LOGIN,MYSQL_PASS,MYSQL_BASE,0,NULL,0))
    {
        return true;
    } 
    else {
        return false;
    }
}

Note: Outside the class, on my main window (wxwidgets) this is working without any problem:

 str = wxT("SELECT idclient, name,  created_by, created_at, modified_by, modified_at FROM client WHERE isdel=0 ORDER BY name ASC;");
        mysql_query(&mysql, str.mb_str());
        result = mysql_store_result(&mysql);

Update

The goal of the class was to simply use it from the wxWidgets parts without taking care of the convertion.

I have tried to separate but it doesn't seem that the problem is coming from the wxString .

Something really strange I haven't been able to understand is that if I call:

MySQL sql;
sql.Query(wxT("blabla"), NULL)

from the constructor of my wxFrame it doesn't crash. If I do the same on a function on the wxFrame class, itself called from its constructor, it crashes.

like:

constructor {
   Query
}

Ok

constructor {
 function()
}

fonction {
    Query
}

Crash

I'm really confused...

Why are you mixing wxStrings and MySQL? That doesn't seem like a good idea. I would highly suggest just using normal strings everywhere, and separate out the WxWidgets code and the MySQL code completely, so you can figure out what's going wrong properly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM