c++用mysql数据库,mysql_query函数老是失败

女神打Boss 2017-11-17 10:21:39

//初始化数据
int VspdCToMySQL::ConnMySQL(char *host,char * port ,char * Db,char * user,char* passwd,char * charset,char * Msg)
{
if( mysql_init(&mysql) == NULL )
{
Msg = "inital mysql handle error";
return 1;
}

if (mysql_real_connect(&mysql,host,user,passwd,Db,0,NULL,0) == NULL)
{
Msg = "Failed to connect to database: Error";
return 1;
}

if(mysql_set_character_set(&mysql,"GBK") != 0)
{
Msg = "mysql_set_character_set Error";
return 1;
}
return 0;
}
//查询数据
CString VspdCToMySQL::SelectData(char * SQL,int Cnum,char * Msg)
{
MYSQL_ROW m_row;
MYSQL_RES *m_res;
char sql[2048];
sprintf(sql,SQL);
int rnum = 0;
char rg = 0x06;//行隔开
char cg = {0x05};//字段隔开

if(mysql_query(&mysql,sql) != 0)
{
Msg = "select ps_info Error";
return "";
}
m_res = mysql_store_result(&mysql);

if(m_res==NULL)
{
Msg = "select username Error";
return "";
}
CString str("");
while(m_row = mysql_fetch_row(m_res))
{
for(int i = 0;i < Cnum;i++)
{
str += m_row[i];
str += rg;
}
str += cg;
rnum++;
}

mysql_free_result(m_res);

return str;
}


//插入数据
int VspdCToMySQL::InsertData(char * SQL,char * Msg)
{
char sql[2048];
sprintf_s(sql,SQL);
if(mysql_query(&mysql,sql) != 0)
{
Msg = "Insert Data Error";
return 1;
}
return 0;
}
//调用部分
//初始化
vspdctomysql = new VspdCToMySQL;
if(vspdctomysql->ConnMySQL(host, db_port, dbname, user, passwd, charset, Msg) == 0)
showInfo3List("数据库连接成功");
else
showInfo3List("数据库连接失败");

// 数据库插入
bool CGY_YTG_TOOLView::insertData(char *s_sql)
{
char* Msg = "";//消息变量
if(vspdctomysql->InsertData(s_sql, Msg) == 0)
{
//CString str;
//str.Format("%s", s_sql);
//AfxMessageBox(str);
ShowDataBaseMessage("插入数据成功");
return true;
}else
{
//CString str;
//str.Format("%s", s_sql);
//AfxMessageBox(str);
ShowDataBaseMessage("插入数据失败");
return false;
}
}

// 数据库查询
CString CGY_YTG_TOOLView::selData(char *s_sql)
{
char* Msg = "";//消息变量
CString sData;
sData = vspdctomysql->SelectData(s_sql, 20, Msg);
return sData;
}

我是初始化后查询完开始执行插入操作,成功后接一次查询
插入操作成功N次10次20此左右,就一直失败
mysql_query失败的返回值是1
...全文
1451 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
oyljerry 2017-11-17
失败的时候,查看一下数据库日志等,以及mysql api的error code。
  • 打赏
  • 举报
回复
女神打Boss 2017-11-17
我是按照这个博客写的不知道有什么问题 博客地址
  • 打赏
  • 举报
回复
oyljerry 2017-11-17
一个是做查询,插入之间做同步,同时数据库插入等是否事务成功。
  • 打赏
  • 举报
回复
女神打Boss 2017-11-17
引用 6 楼 wodexiaojidan 的回复:
你在外面在用一个互斥锁就可以了,lock(&mtx) query unlock(&mtx) lock(&mtx) insert unlock(&mtx)
互斥锁不太会用,后面有空再学习,我暂时用2个连接对象,测试可以满足要求 多谢
  • 打赏
  • 举报
回复
wodexiaojidan 2017-11-17
你在外面在用一个互斥锁就可以了,lock(&mtx) query unlock(&mtx) lock(&mtx) insert unlock(&mtx)
  • 打赏
  • 举报
回复
女神打Boss 2017-11-17
引用 4 楼 wodexiaojidan 的回复:
查询和插入肯定是互斥的,你那个mysql是全局的,可能在try_lock的时候就返回了。
可以用2个mysql对象吗?
  • 打赏
  • 举报
回复
wodexiaojidan 2017-11-17
查询和插入肯定是互斥的,你那个mysql是全局的,可能在try_lock的时候就返回了。
  • 打赏
  • 举报
回复
女神打Boss 2017-11-17
引用 2 楼 oyljerry 的回复:
失败的时候,查看一下数据库日志等,以及mysql api的error code。
我好像找到问题了,我的插入操作是在一个线程里,查询操作在另一个线程,查询操作是一直在查询,失败的几率可能是同时操作数据库的原因,我暂时停掉查询线程就没有失败了 请问这个问题改怎么处理
  • 打赏
  • 举报
回复
相关推荐
发帖
数据库
加入

3968

社区成员

VC/MFC 数据库
社区管理员
  • 数据库
申请成为版主
帖子事件
创建了帖子
2017-11-17 10:21
社区公告
暂无公告