出现这种问题,我这里遇到的原因是因为上一次查询的结果集没有释放完全,导致查询失败
此时的错误内容是:Commands out of sync; you can't run this command now
该错误内容由mysql_error(conn)语句输出。
如果你在上次查询时忘了调用mysql_free_result();
那就回去加一行就可以了。
如果还是不好使,请继续往下看。
很有可能你是在上次查询中调用了多条SELECT语句或调用了存储过程。在这种情况下,需要对mysql_real_connect()中的参数进行修改。
一般情况下,我们最后一个参数写的是0,但是如果你调用了存储过程,即返回集可能不只有一个,就需要将最后一个参数变成CLIENT_MULTI_STATEMENTS。
此外,该参数的其他值请参阅Mysql文档或我查阅的中文网(非官方)。
假如你还是不好使,那么你需要在原先释放结果集的地方,将原来的代码替换成
while (!mysql_next_result(conn)) { res = mysql_store_result(conn); mysql_free_result(res); }
其中conn是连接句柄,res是结果集
下面给上我的全部代码,该代码仅供参考,我将我的主机名删去了。
1 #include <stdio.h> 2 #include <string.h> 3 #include <mysql/mysql.h> 4 int main() 5 { 6 int temppppp; 7 char sql[100]; //存放SQL语句 8 char host[46] = ""; //MySQL数据库主机名 9 char dburl[8] = "normal"; //数据库名称 10 const char username[9] = "arknight"; //用户名 11 const char password[9] = "arknight"; //密码 12 unsigned int port = 3306; //端口号 13 MYSQL *conn; //Mysql连接指针 14 MYSQL_RES *res; //Mysql结果集 15 MYSQL_ROW row; //行变量 16 printf("正在尝试连接数据库 "); 17 if ((conn = mysql_init((MYSQL *)0)) //初始化MYSQL 18 && (mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8") == 0) //开始连接 19 && mysql_set_server_option(conn, MYSQL_OPTION_MULTI_STATEMENTS_ON) 20 && mysql_real_connect(conn, host, username, password, dburl, port, NULL, CLIENT_MULTI_STATEMENTS)) //连接成功 21 { 22 puts("连接成功"); 23 } 24 else 25 { 26 puts("无法连接数据库"); 27 exit(-1); 28 } 29 30 int i = 0; 31 int ret = 0; 32 33 strcpy(sql, "call gettype"); 34 puts("............................................."); 35 ret = mysql_real_query(conn, sql, strlen(sql)); 36 printf("******%d ", ret); 37 res = mysql_store_result(conn); 38 i = (int)mysql_num_rows(res); 39 for (int a = 0; a < i; a++) 40 { 41 row = mysql_fetch_row(res); 42 if (row == NULL) 43 { 44 break; 45 } 46 printf("%s %s ", row[0], row[1]); 47 } 48 while (!mysql_next_result(conn)) 49 { 50 res = mysql_store_result(conn); 51 mysql_free_result(res); 52 } 53 //输出完成 54 printf("FINISHED "); 55 56 strcpy(sql, "select * from showall"); 57 puts("............................................."); 58 ret = mysql_real_query(conn, sql, strlen(sql)); 59 printf("%s", mysql_error(conn)); 60 printf("******%d ", ret); 61 res = mysql_store_result(conn); 62 i = (int)mysql_num_rows(res); 63 for (int a = 0; a < i; a++) 64 { 65 row = mysql_fetch_row(res); 66 if (row == NULL) 67 { 68 break; 69 } 70 printf("%s %s %s %s %s ", row[0], row[1], row[2], row[3], row[4]); 71 } 72 while (!mysql_next_result(conn)) 73 { 74 res = mysql_store_result(conn); 75 mysql_free_result(res); 76 } 77 78 mysql_close(conn); 79 return 0; 80 }