我有一个MySQL 8.0.17数据库示例项目,我正在64位windows计算机上使用Visual Studio CE 2017编译。这是一个控制台应用程序。请看下面的代码,它是样板。我遇到的问题是在初始化数据库后尝试操作字符串时。即:取消注释sprintf_s()会导致抛出异常。我在试着理解这是出于某种原因的设计,还是一个bug?或者我可能还做错了什么?
include "pch.h"
include <windows.h>
include <iostream>
include <winsock.h>
include <stdio.h>
include <mysql.h>
int main()
{ std::cout << "Hello World!\n";
MYSQL conn;
MYSQL_RES *res_set;
MYSQL_ROW row;
mysql_init(&conn);
char str[6];
// sprintf_s(str, 5, "test");
if(!mysql_real_connect(&conn,"localhost","usr","pas","db",0,NULL,0))
{ fprintf(stderr, "Connection Failed: %s\n", mysql_error(&conn));
} else
{ fprintf(stderr, "Successfully connected to Database.\n");
int status = mysql_query(&conn, "SELECT * FROM users");
res_set = mysql_store_result(&conn);
int count = mysql_num_rows(res_set);
printf("No of rows = %d\n", count);
while ((row = mysql_fetch_row(res_set)) != NULL)
{ for (int i = 0; i < mysql_num_fields(res_set); i++)
{ printf("%s \t", row != NULL ? row : "NULL");
} printf("\n");
}
}
mysql_close(&conn);
// getchar();
return 0;
}我发现有趣的是,如果我将sprintf_s()放在mysql_init()之上,它就能正常工作吗?那么,这是否意味着我需要在每个请求上打开一个新连接?因为它在5.7版本中不是这样工作的,在5.7版本中,我可以建立连接,然后执行几个语句。任何回应都会非常感谢,因为我已经在这方面挣扎了一段时间了……
以下是当编译中包含sprintf_s()时,调试器在调用mysql_num_rows()时抛出的异常...
ConsoleApplication1.exe中的0x00007FFED78550C0 (libmysql.dll)处引发异常: 0xC0000005:访问冲突读取位置0x0000000000000000。
因此,我将其精简为尽可能少的行,以重现错误:
int main()
{ MYSQL conn;
MYSQL_RES *res_set;
mysql_init(&conn);
char str[50];
strcpy_s(str, "test");
if (mysql_real_connect(&conn,"localhost","user","pass","db",0,NULL,0))
{ int status = mysql_query(&conn, "SELECT * FROM users");
res_set = mysql_store_result(&conn);
int count = mysql_num_rows(res_set); // Exception is thrown here.
}
mysql_close(&conn);
}为什么会发生这种情况呢?谢谢,布莱恩..。
发布于 2019-11-02 03:44:10
您没有检查是否有任何行字段为空
改为使用
while ((row = mysql_fetch_row(res_set)) != NULL)
{ for (int i = 0; i < mysql_num_fields(res_set); i++)
{
printf("%s ", row[i] ? row[i] : "NULL");
}
printf("\n");
}发布于 2019-11-04 10:48:53
感谢那些回答了我问题的人。我回滚到MySQL的5.7版本,它工作正常。也许我尝试采用最新的8.0版本有点太早了。
https://stackoverflow.com/questions/58664597
复制相似问题