【C/C++】VS连接mysql数据库
折途想要敲代码 2024-06-18 11:35:02 阅读 66
VS配置
VS连接mysql数据库首先需要先做五个步骤的配置:
1、选择x64解决方案
2、配置包含目录
项目 -> 属性 -> VC++目录 -> 包含目录
找到你mysql的安装目录,把MYSQL Server x.x 目录下的 include 目录的路径添加进这个包含目录里。
3、配置库目录
项目 -> 属性 -> VC++目录 -> 库目录
找到你mysql的安装目录,把MYSQL Server x.x 目录下的 lib 目录的路径添加进这个库目录里。
4、添加附加依赖项
项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项
直接把“libmysql.lib”这个文件名添加进附加依赖项里,不需要携带路径
5、复制 libmysql.lib 文件
在lib目录下找到 libmysql.lib 这个文件,就是上面第四点提到的只需要添加文件名的那个文件,我们将它复制。
粘贴到C盘下的Windows/System32目录下
C/C++操作mysql
1、获取数据库连接句柄
初始化一个句柄,参数填NULL就行。
MYSQL* con = mysql_init(NULL);
2、连接到数据库
第一个参数 mysql :句柄,传入步骤1得到的句柄就行。
第二个参数 host :主机,本地的话填“127.0.0.1” 。
第三个参数 user :mysql 用户名。
第四个参数 passwd:mysql 对应用户的密码。
第五个参数 db :需要连接的数据库的库名。
第六个参数 port :mysql 的端口号,默认都是3306。
第七个参数 unix——socket :unix连接方式。是否使用socket或管道机制,填入NULL不使用就行。
第八个参数 clientflag :运行ODBC数据库的标记,一般为0就行。
连接数据库,成功则返回句柄,失败则返回NULL,所以可以通过返回值来判断是否连接成功。
mysql_real_connect(con, host, user, password, database_name, port, NULL, 0)
2.5设置编码格式
第一个参数 mysql :把句柄传入就行。
第二个参数 csname :编码格式名字,VS默认是GBK,所以我们这边也设置为“GBK”
成功返回0,失败返回非0
mysql_set_character_set(con, "gbk");
3、执行sql语句
第一个参数 mysql :传入句柄。
第二个参数 q : 执行sql的语句。
成功返回0,失败返回非0
mysql_query(con, "show tables;")
4、获取执行结果
两个函数都可以获取到句柄执行的结果集。
第一个会将指定表的数据全部都保存起来。
第二个相比较第一个函数,执行速度快,并且占用内存小,不过会阻止其他线程使用,也就是不能多线程。一般情况我们用第二个就行。
MYSQL_RES* res = mysql_use_result(con);
4.5 获取字段名
获取字段名,将步骤4的结果集传入即可。
MYSQL_FIELD* fieldName = mysql_fetch_field(res);
得到的MYSQL_FIELD* 可以直接当成数组使用,下面这样就可以获取到结果集的第一个字段名了,当数组使用时候再取一个name才能得到字段名。
fieldName[0].name
需要遍历获取字段名,我们就需要知道一共多少个字段名,然后遍历即可:
获取字段数量,传入结果集。
MYSQL_RES* res = mysql_use_result(con);MYSQL_FIELD* fieldName = mysql_fetch_field(res);for (unsigned int i = 0; i < mysql_num_fields(res); i++) {cout << fieldName[i].name << '\t';}cout << endl;
5、将结果从结果集中取出
把结果一行一行取出来,用MYSQL_ROW去接收,每次都会获取到下一行的结果,直到没有可以获取的结果,返回NULL。
使用起来也是和数组差不多。
因为要遍历,所以要获取每行结果的数量,和字段数是一样的,所以获取长度的函数就是上面那个。
MYSQL_ROW row;while (row = mysql_fetch_row(res)) {//按行读取结果集for (int i = 0; i < mysql_num_fields(res); i++) {//将读取的行结果一个一个输出cout << row[i] << '\t';}cout << endl;}
6、释放资源
释放结果集资源。
mysql_free_result(res);//释放结果集资源
关闭数据库连接。
mysql_close(con);//释放mysql连接资源
完整演示代码:
#include <iostream>#include <mysql.h>using namespace std;const char* host = "127.0.0.1";const char* user = "root";const char* password = "123456";const char* database_name = "test";const int port = 3306;int main(void) {//获取数据库连接句柄MYSQL* con = mysql_init(NULL);//设置连接选项//mysql_options(con, MYSQL_SET_CHARSET_NAME, "GBK");//连接到数据库if (!mysql_real_connect(con, host, user, password, database_name, port, NULL, 0)) {perror("warming");return -1;}//设置GBK编码,以防乱码mysql_set_character_set(con, "gbk");//执行sql语句if (mysql_query(con, "select * from student")) {cout << "warming," << mysql_error(con) << endl;}//获取sql语句的执行结果MYSQL_RES* res = mysql_use_result(con);//获取结果的字段MYSQL_FIELD* fieldName = mysql_fetch_field(res);for (unsigned int i = 0; i < mysql_num_fields(res); i++) {cout << fieldName[i].name << '\t';}cout << endl;MYSQL_ROW row;while (row = mysql_fetch_row(res)) {//按行读取结果集for (int i = 0; i < mysql_num_fields(res); i++) {//将读取的行结果一个一个输出cout << row[i] << '\t';}cout << endl;}mysql_free_result(res);//释放结果集资源mysql_close(con);//释放mysql连接资源return 0;}
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。