【问题标题】:Crash using a class using mysql lib with wxWidgets使用带有 wxWidgets 的 mysql lib 的类崩溃
【发布时间】:2011-08-30 07:05:45
【问题描述】:

我在一个问题上卡住了一段时间,找不到好的解决方案。

我写了一个小类来在我的项目中使用 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
}

好的

constructor {
 function()
}

fonction {
    Query
}

崩溃

我真的很困惑......

【问题讨论】:

  • 这与您的崩溃无关,但您将 MYSQL_RES * result 作为指针传递,而不是对指针的引用。所以,最终你的赋值result = mysql_store_result 只修改了局部变量result。换句话说,在cldataproject::Load 中,result 在你的sql.Query 之后仍然为NULL
  • 另外,您在 mysql_store_result 之后关闭查询 - 您可能只是在测试,但您还需要调用 mysql_free_result,所有这些都在关闭查询之前(可能)。
  • blazes 有正确答案。

标签: c++ sql c class wxwidgets


【解决方案1】:

为什么要混合 wxStrings 和 MySQL?这似乎不是一个好主意。我强烈建议在任何地方都使用普通字符串,并将 WxWidgets 代码和 MySQL 代码完全分开,这样您就可以正确找出问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多