mysql c api的重连问题

D_XiYun 2011-04-08 04:16:43
请教一下mysql重连的问题,以下是代码:
UINT ReadSQL(LPVOID pParam)
{
unsigned int len;
MYSQL_RES *res_set;
MYSQL_ROW row;
unsigned int len;
char mysql_query_cmd[1000];
CString mySqlState;
my_bool reconnect = 1;
MYSQL* sock;
int failedNum = 0;
if (mysql_library_init(0, NULL, NULL))
{
::AfxMessageBox(_T("could not initialize MySQL library\n"),MB_ICONERROR | MB_OK);
::AfxGetApp()->GetMainWnd()->PostMessageW(WM_CLOSE, 0, 0);
return -1;

}
sock = mysql_init(0);
if (sock == NULL)
{
::AfxMessageBox(_T("初始化MySql数据库失败!"),MB_ICONERROR | MB_OK);
return -1;
}
mysql_options(sock, MYSQL_OPT_RECONNECT, &reconnect);
// 连接数据库
if (mysql_real_connect(sock, pDoc->m_dbHost, pDoc->m_dbUser, pDoc->m_dbPass, pDoc->m_dbName, 0, NULL, 0) == NULL)
{
::AfxMessageBox(_T("连接数据库失败!"),MB_ICONERROR | MB_OK);
mysql_close(sock);
return -1;
}
//由于不确定我mysql c api的版本在5.1.6之上还是之下,我有执行了一遍mysql_options()
mysql_options(sock, MYSQL_OPT_RECONNECT, &reconnect);
// 设置字符集
mysql_set_character_set(sock,"gb2312");

while(true)
{
if(failedNum > 5)
{
mySqlState = mysql_stat(sock);
if(::AfxMessageBox(mySqlState +_T(",请检查数据库服务是否开启以及网络是否连接通畅。\n重新尝试连接请点击“重试”,退出程序请单击“取消!”"),MB_ICONERROR | MB_RETRYCANCEL) == IDRETRY)
{
if (!mysql_ping(sock)) //ping成功!
{
mysql_close(sock);//关闭sock
if (mysql_real_connect(sock, pDoc->m_dbHost, pDoc->m_dbUser, pDoc->m_dbPass, pDoc->m_dbName, 0, NULL, 0) != NULL)
{
failedNum = 0;
}
}
else
{
::AfxGetApp()->GetMainWnd()->PostMessageW(WM_CLOSE, 0, 0);
return -1;
}
}



len = sprintf_s(mysql_query_cmd,1000,"select * from humiturecpy");
rc = mysql_real_query(sock,mysql_query_cmd, len);
if(rc != 0)
{
::AfxMessageBox(_T("访问数据库失败!"),MB_ICONERROR | MB_OK);
failedNum ++;
}
else
{
//此处省略对查询结果集的一些操作
}


//此处省略一些mysql_real_query操作,同上

Sleep(3000)
}
if(sock != NULL)
{
mysql_close(sock);
sock = NULL;
}
mysql_library_end();
return 0;
}

问题1:上述代码中当由于断网(拔掉网线)问题导致failedNum > 5时,插入网线,选择“重试”,为什么if (mysql_real_connect(sock, pDoc->m_dbHost, pDoc->m_dbUser, pDoc->m_dbPass, pDoc->m_dbName, 0, NULL, 0) != NULL)这句会报错?
问题2:如果我这种思路是错误的,还有什么方式能在插入网线之后检测连接,如果网络通畅,继续执行这个线程?
...全文
269 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
D_XiYun 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhll879 的回复:]
MYSQL* sock;
这里你声明了一个对象,我想你在断开网络后,再执行mysql_real_connect之前,是不是要把sock对象从新初始化?
建议而已
[/Quote]


谢谢啊,真的是这样 ,重新mysql_init一下就好了
小小蔷薇 2011-04-08
  • 打赏
  • 举报
回复
MYSQL* sock;
这里你声明了一个对象,我想你在断开网络后,再执行mysql_real_connect之前,是不是要把sock对象从新初始化?
建议而已

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧