今天写一个和winsock和mysql有关的程序,运行时总是停在:MYSQL_RES * result = mysql_store_result(mysql)上,单步的时候蛋疼地发现mysql总是显示内存读取出错。
于是开了个小程序实验了一下:
#include <winsock.h>
#include <mysql.h>
#include <stdio.h>
void add_one_in_name(MYSQL *mysql, char *name);
int main(void)
{
int i = 100;
MYSQL *mysql = mysql_init(0);
mysql_real_connect(mysql, "localhost", "root", "root", "webrobot", 0, 0, 0);
while(i--)
add_one_in_name(mysql,"我是中文");
mysql_close(mysql);
return 0;
}
void add_one_in_name(MYSQL *mysql, char *name)
{
char sql[256];
int flag = 0;
mysql_query(mysql, "select * from robot");
MYSQL_RES * result = mysql_store_result(mysql);
MYSQL_ROW row;
while (row = mysql_fetch_row(result))
{
if (strcmp(row[0], name) == 0)
{
flag = 1;
puts(row[0]);
}
}
if (flag == 1)
sprintf(sql, "update robot set value=value+1 where name='%s'", name);
else
sprintf(sql, "insert into robot values('%s',1)", name);
mysql_query(mysql, sql);
mysql_free_result(result);
}
函数就是原程序的函数,然而运行一下并没有什么问题,这就奇了怪了。
然后我又回头仔细单步了一下,终于发现mysql出错的点。
把测试程序改成这样:
#pragma comment(lib, "ws2_32.lib")
#include <winsock.h>
#include <mysql.h>
#include <stdio.h>
void add_one_in_name(MYSQL *mysql, char *name);
int main(void)
{
int i = 100;
MYSQL *mysql = mysql_init(0);
mysql_real_connect(mysql, "localhost", "root", "root", "webrobot", 0, 0, 0);
LPWSADATA wsaData;
WSAStartup(MAKEWORD(2, 1), &wsaData);
while(i--)
add_one_in_name(mysql,"我是中文");
mysql_close(mysql);
return 0;
}
void add_one_in_name(MYSQL *mysql, char *name)
{
char sql[256];
int flag = 0;
mysql_query(mysql, "select * from robot");
MYSQL_RES * result = mysql_store_result(mysql);
MYSQL_ROW row;
while (row = mysql_fetch_row(result))
{
if (strcmp(row[0], name) == 0)
{
flag = 1;
puts(row[0]);
}
}
if (flag == 1)
sprintf(sql, "update robot set value=value+1 where name='%s'", name);
else
sprintf(sql, "insert into robot values('%s',1)", name);
mysql_query(mysql, sql);
mysql_free_result(result);
}
果然就出错了。
于是找到了错误的原因,在连接mysql数据库成功后,再动态链接winsock,mysql就会被“挤下来”,发生读取内存失败的错误。
具体的原因有待进一步地学习。
然而,调整顺序之后。。。。。
会在结束的时候报错:
Stack around the variable 'wsaData' was corrupted
具体原因仍然有待学习。