MySQL数据库学习笔记之C访问(Linux系统)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值