Сбой при использовании класса с использованием mysql lib с wxWidgets - PullRequest
0 голосов
/ 30 августа 2011

Я застрял на некоторое время над проблемой и не могу найти хорошее решение.

Я написал небольшой класс для использования c mysql lib в моем проекте.

Я использую этот класс из другого класса, компиляция идет хорошо, но когда я называю это сбоем программного обеспечения.

Я верю, что делаю что-то не так, но не могу найти что. Может быть, какой-нибудь продвинутый госзакупок узнает.

Класс Sql:

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:

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;
}

Мой другой класс для доступа к:

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
    {
......

Функция открытия:

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;
    }
}

Примечание: вне класса, в моем главном окне (wxwidgets) это работает без проблем:

 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);

Обновление

Целью этого класса было просто использовать его из частей wxWidgets, не заботясь о преобразовании.

Я пытался отделиться, но, похоже, проблема не в wxString.

Что-то действительно странное, что я не смог понять, это то, что если я позвоню:

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

от конструктора моего wxFrame не вылетает. Если я сделаю то же самое для функции класса wxFrame, которая сама вызывается из конструктора, она вылетает.

как:

constructor {
   Query
}

Ok

constructor {
 function()
}

fonction {
    Query
}

Крах

Я действительно запутался ...

1 Ответ

0 голосов
/ 30 августа 2011

Почему вы смешиваете wxStrings и MySQL?Это не кажется хорошей идеей.Я бы настоятельно рекомендовал использовать везде обычные строки и полностью отделить код WxWidgets и код MySQL, чтобы вы могли понять, что происходит неправильно.

...