1、C语言访问MySQL(Linux)
(1)连接数据库使用的头文件和库文件
#include <mysql/mysql.h>
//有些也在#include <mysql.h>
//程序中使用了访问mysql的有关函数接口,需要在链接时指定库名
//Linux平台为-lmysqlclient
通过C/C++连接数据库:
创建套接字等安装到库里面了,开发库中就封装了网络通讯这一部分(创建连接,组装报文等);
安装了开发库之后就有mysql.h这个头文件,路径如下:/usr/include/mysql/mysql.h
或者使用find命令查找:find/-name mysql.h
(2)初始化连接句柄
MYSQL *mysql_init(MYSQL *mysql);
//该方法用来初始化一个连接句柄,如果参数为空,则返回一个指向新分配的连接句柄的指针
//如果传递一个已有的结构,它将被重新初始化,出错时返回NULL
(3)连接数据库
MYSQL *mysql_real_connet(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);
//在不使用时,可以用该方法关闭连接
(5)执行sql语句
int mysql_query(MYSQL*mysql,const char*q);
/*
参数:
mysql是之前连接后返回的指针;
q是要执行的sql语句,末尾没有分号,这个在命令工具中使用不同
返回值:成功返回0;
注意:如果sql语句中有二进制数据,则应该使用mysql_real_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;
(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);
(11)获取错误信息
unsigned int mysql_errno(MYSQL *mysql); //返回错误码
const char *mysql_error(MYSQL *mysql);//返回错误信息描述
示例
//前提是创建数据库quzijie:create database quzijie_test;
//创建表格student_table;
//create table student_table(id int,name varchar(20),age int);
//往表中插入一些数据
//insert into student_table values(1001,'lxr',20);
//insert into student_table values(1001,'zjy',20);
//mysql_test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>
int main()
{
MYSQL mysql_conn;
MYSQL *mysql=mysql_init(&mysql_conn);
if(mysql==NULL)
{
printf("mysql init err");
exit(1);
}
mysql=mysql_real_connect(mysql,"localhost","root","quzijie_123","quzijie_test",3306,NULL,0);
if(mysql==NULL)
{
printf("connect err\n");
exit(1);
}
printf("success\n");
char * sql="insert into student_table value(1003,'xxx',20)";//演示插入数据
//char * sql="select *from student_table";
if(mysql_query(mysql,sql)!=0)
{
printf("query sql err:%s\n",mysql_error(mysql));
}
MYSQL_RES *res=mysql_store_result(mysql);//没有执行查询,所以结果集为空
if(res==NULL)
{
printf("res err:%s\n",mysql_error(mysql));
exit(1);
}
int num=mysql_num_rows(res);
printf("num=%d\n",num);
int count=mysql_field_count(mysql);
printf("count=%d\n",count);
for(int i=0;i<num;i++)
{
MYSQL_ROW row=mysql_fetch_row(res);
for(int j=0;j<count;j++)
{
printf("%s ",row[j]);
}
printf("\n");
}
mysql_free_result(res);
mysql_close(mysql);
}
注意:
(1)编译时链接库mysqlclient:
gcc -o mysql_test mysql_test.c -lmysqlclient
需要加上库名:mysqlclient,如果是其他的数据库,它的库名有可能会变
(2)mysql_store_result是获取sql语句的结果集,只执行了插入语句,没有执行查询语句,所以结果集为NULL,所以插入数据成功后打印res err