【发布时间】: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 有正确答案。