今天聊聊linux下去用c/c++连接mysql去进行一些语句的操作流程
前提:
- 首先确保你的虚拟机安装好了mysql
- 安装好了c/c++开发库
管理员模式下: apt install libmysqlclient-dev
下面直接上具体流程操作:
1、连接数据库使用的头文件和库文件
- #include
- 有些也在 #include
- 程序中使用了访问mysql的有关函数接口,需要在链接时指定库名: linux平台为 -lmysqlclient
2、初始化连接句柄
- MYSQL *mysql_init(MYSQL *mysql);
- 该方法用来初始化一个连接句柄,如果参数为空,则返回一个指向新分配的连接句柄的指针。如果传递一个已
- 有的结构,它将被重新初始化。出错时返回为NULL。
3、连接数据库
- MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
- const char *user, const char *passwd,
- const char *db, unsigned int port,
- const char *unix_socket,
- unsigned long clientflag);
- 参数介绍,其中
- mysql是上一步mysql_init方法初始化后返回的指针,
- host是主机名,或者连接的服务器IP地址,本地可以使用"localhost",或"127.0.0.1"或"",或
- NULL
- user是用户名,数据库中添加的用户,管理员是"root",
- passwd 是用户的密码,
- db 是数据库的名字,
- port 是数据库的端口 3306,也可直接写0,意味着使用mysql默认端口,
- unix_socket 一般为NULL,表示不使用unix套接字或者管道
- clientflag 标志位,一般给0
- 返回值,失败为NULL,成功与第一个参数值相同。
4、关闭连接
- void mysql_close(MYSQL *mysql);
- 在不使用时,可以用该方法关闭连接。
到这里的话基本的一套连接就完成了,我先给出代码,下面再针对语句操作的api来说
- #include
- #include
- #include
- #include
- #include
-
- int main()
- {
- MYSQL mysql_conn;
- MYSQL *mysql=mysql_init(&mysql_conn);
- if(mysql==NULL)
- {
- printf("mysql init err\n");
- exit(1);
- }
- //等价&mysql_conn,"127.0.0.1"...
- if(mysql_real_connect(mysql,"127.0.0.1","oorik","033018","c220",3306,NULL,0)==NULL)
- {
- printf("connect err\n");
- exit(1);
- }
- printf("连接成功\n");
-
- mysql_close(mysql);
- exit(0);
-
- }
5、执行sql语句
- int mysql_query(MYSQL *mysql, const char *q);
- 参数: mysql 是之前连接后返回的指针,
- q 是要执行的sql语句,末尾可以没有分号,这个在命令工具中使用不同。
- 返回值:成功返回0。
- 注意:如果sql语句中有二进制数据,则应该使用mysql_real_query();
这个函数作用是执行sql语句,指的是任何语句,而不是简单的增删什么的
下面我分别给出例子:
我们有个数据库,表中内容如下:
执行下面的添加语句如下:
- //李四后面的;可加可不加
- char * sql1="insert into mytest values(15,'李四')";
- if(mysql_query(mysql,sql1)!=0)
- {
- printf("执行失败\n");
- mysql_close(mysql);
- exit(1);
- }
执行更新语句:
char *sql1="update mytest set id=30 where name='李四'";
执行删除语句:
char *sql1="delete from mytest where id=30";
此时表中只剩下两条数据,我们应该怎么打印出来呢?那么就先聊聊下面的函数,配合mysql_query()一起使用
6、提取结果
- MYSQL_RES *mysql_store_result(MYSQL *mysql); 一次性提取所有数据
- //MYSQL_RES *mysql_use_result(MYSQL *mysql);一次提取一行数据
- 该方法,是在执行 mysql_query()成功之后调用的,可以立刻保存在客户端中收到的所有数据。它返回一个
- 指向结果集结构的指针。如果失败返回NULL;
7、获取结果集中有多少行
- uint64_t mysql_num_rows(MYSQL_RES *res);
- 只有执行了 mysql_store_result()之后,才可以调用该方法,获取结果集中的行数。如果没有返回行,则
- 为0;
- res是mysql_store_result函数返回的接收参数
8、取出结果集中的一行记录
- MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
- 从结果集中取出一行,并把它存放到一个行结构中。当数据用完或者出错时,返回为NULL,通常该方法需要循
- 环调用。
9、查看记录行的列数
- unsigned int mysql_field_count(MYSQL *mysql);
- 列数是一创建就有,因此传入的是句柄,而不是结果集
10、释放结果集占用的内存
- void mysql_free_result(MYSQL_RES *result);
- 执行完sql语句,得到返回的结果集,处理完数据后,需要调用该方法释放存放结果集的内存空间。
11、获取错误信息
- unsigned int mysql_errno(MYSQL *mysql); 返回错误码
- const char *mysql_error(MYSQL *mysql); 返回错误信息描述
好了根据上面的函数,我们调用去打印表里的内容就可以
代码示例(只是打印这一段的)完整的自己去整合,各个部分我在上面都给出来了:
- char *sql1="select * from mytest";
- if(mysql_query(mysql,sql1)!=0)
- {
- printf("执行失败\n");
- mysql_close(mysql);
- exit(1);
- }
-
- MYSQL_RES *res=mysql_store_result(mysql);//获取结果,结果集
- if(res==NULL)
- {
- printf("result failed\n");
- mysql_close(mysql);
- exit(1);
- }
- int num=mysql_num_rows(res);//一共有多少行,通过结果集获取
- printf("查询到%d条记录\n",num);
- int field=mysql_field_count(mysql);//多少列,列数是一创建就有,因此传入的是句柄,而不是结果集
- printf("id name\n");
- for(int i=0;i
- {
- //取出一行记录
- MYSQL_ROW r=mysql_fetch_row(res);
- for(int j=0;j
- {
- printf("r[%d]=%s ",j,r[j]);
- }
- printf("\n");
- }
- //释放结果集
- mysql_free_result(res);
-
今天分享就到这..
-
相关阅读:
[附源码]计算机毕业设计JAVA疫情背景下社区公共卫生服务系统
广告内容定向分级,保护未成年人身心健康
swift内存绑定
034-用Swing组件综合应用(实现QQ登录与注册界面功能)
【信号处理】基于Matlab实现男女音变声系统
[Python]Django 模型
SpringMvc视图解析器
Python9-基于socket的网络编程
TypeScript 学习笔记
Socket网络编程——(一)
-
原文地址:https://blog.csdn.net/weixin_51609435/article/details/127642258