利用C语言访问mysql

  • 一、相关头文件以及函数:
  • 1、连接数据库使用的头文件和库文件
  • 2、初始化连接句柄
  • 3、连接数据库
  • 4、关闭连接
  • 5、提取结果
  • 6、获取结果集的行数
  • 7、取出结果集中的一行记录
  • 8、查看记录行的列数
  • 9、释放结果集占用的内存
  • 10、获取错误信息
  • 二、程序示例
  • 1、对数据库的表进行增删改操作,并不需要程序返回相应的结果:
  • 2、执行select查询语句的时候,需要程序将数据表中查询的语句返回


一、相关头文件以及函数:

1、连接数据库使用的头文件和库文件

#inlcude <mysql/mysql.h>

程序中使用访问mysql的有关函数接口,需要在连接时指定库名:
例如编译链接的时候指令如下:
gcc -o main mian.c -lmysqlclient

2、初始化连接句柄

该方法用来初始化一个连接句柄。
①如果参数为空,则返回一个指向新分配的连接句柄的指针。示例如下:

MYSQL * mysql=mysql_init(NULL);

②如果传递一个已有的结构,它将被重新初始化。

MYSQL * mysql_init(MYSQL * mysql);

出错时返回NULL

3、连接数据库

MYSQL * mysql_real_connect(MYSQL * mysql,const char* host,const char* user,const char* password,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:用户名。
password:用户密码。
db:数据库的名字。
port:数据库的端口3306,也可以填写0,意味着使用mysql的默认端口3306。
unix_socket:一般为NULL,表示不适用unix套接字或者管道。
clientflag:标志位,一般给0。

4、关闭连接

void mysql_close(MYSQL* mysql);

5、提取结果

MYSQL_RES *mysql_store_result(MYSQL* mysql);//一次性提取所有数据
MYSQL_RES *mysql_use_result(MYSQL* mysql);//依次提取一行数据

该方法可以保存客户端中接收到的所有数据

6、获取结果集的行数

uint6_t mysql_num_rows(MYSQL_RES* res);

该方法获取结果集中的行数

7、取出结果集中的一行记录

MYSQL_ROW mysql_fetch_row(MYSQL_RES* res);

从结果集中取出一行,并把它存放到一个行结构中。当数据用完或者出错时,返回为NULL。所以通常情况下该方法需要循环调用。

8、查看记录行的列数

unsigned in mysql_field_count(MYSQL * mysql);

9、释放结果集占用的内存

void mysql_free_result(MYSQL_RES* res);

执行完sql语句,得到返回的结果集,处理完数据后,需要调用该方法释放结果集的内存空间

10、获取错误信息

unsigned int mysql_error(MYSQL *mysql);//返回错误码
const char* mysql_error(MYSQL* mysql);//返回错误信息描述

二、程序示例

1、对数据库的表进行增删改操作,并不需要程序返回相应的结果:

①数据库的前期准备:

c 做界面连接mysql数据库 c语言怎么连接mysql数据库_mysql

c 做界面连接mysql数据库 c语言怎么连接mysql数据库_c语言_02


②代码:

//没有结果的查询
#include <stdio.h>
#include <unistd.h>
#include <mysql/mysql.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
int main()
{
    MYSQL* mysql=mysql_init(NULL);
    if(mysql==NULL)
    {
        printf("mysql init err\n");
        exit(0);
    }

    //root有两个用户,一个是本地登陆的,一个是远程登录的用户
    mysql=mysql_real_connect(mysql,"127.0.0.1","root","111111","c215",3306,NULL,0);
    if(mysql==NULL)
    {
        printf("mysql connect err\n");
        exit(0);
    }

    //执行sql语句
    //1、char* sql="insert into stu values('小名',21)";//这个插入语句最后可以加分号也可以不加分号
    //2、char * sql="delete stu from stu where name='小王'";
    //3、
    char* sql="update stu set age=18 where name='小名'";
    int res=mysql_query(mysql,sql);
    if(res!=0)
    {
        printf("mysql query er:%sr\n",mysql_error(mysql));
    }

    mysql_close(mysql);
}

③执行sql1语句在mysql中看到的结果:

c 做界面连接mysql数据库 c语言怎么连接mysql数据库_c 做界面连接mysql数据库_03

④执行sql2语句在mysql中看到的结果:

c 做界面连接mysql数据库 c语言怎么连接mysql数据库_mysql_04

⑤执行sql3语句在mysql中看到的结果:

c 做界面连接mysql数据库 c语言怎么连接mysql数据库_c语言_05

2、执行select查询语句的时候,需要程序将数据表中查询的语句返回

①前期准备;

将之前c215中stu表的数据删完,然后进行下面操作:

c 做界面连接mysql数据库 c语言怎么连接mysql数据库_mysql_06


②代码:

//没有结果的查询
#include <stdio.h>
#include <unistd.h>
#include <mysql/mysql.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
int main()
{
    MYSQL* mysql=mysql_init(NULL);
    if(mysql==NULL)
    {
        printf("mysql init err\n");
        exit(0);
    }

    //root有两个用户,一个是本地登陆的,一个是远程登录的用户
    mysql=mysql_real_connect(mysql,"127.0.0.1","root","111111","c215",3306,NULL,0);
    if(mysql==NULL)
    {
        printf("mysql connect err\n");
        exit(0);
    }

    char* sql="select * from stu";
    int res=mysql_query(mysql,sql);
    if(res!=0)
    {
        printf("mysql query er:%sr\n",mysql_error(mysql));
    }

    //准备拿到结果集,进行空间的分配
    //不能通过结果的成功与否判断是否有数据
    //而应该通过返回的几条决定是否有数据
    MYSQL_RES* mysql_res=mysql_store_result(mysql);
    //这里只能看获取结果是否成功
    if(mysql_res==NULL)
    {
        printf("提取数据失败:%s\n",mysql_error(mysql));
        exit(0);
    }
    //提取当前有多少条记录,这里可能会有条件限制,我需要那种数据
    int num=mysql_num_rows(mysql_res);
    if(num==0)//认为没有记录
    {
        printf("没有记录\n");
    }
    else//有数据
    {
        //取出结果集中的数据
        printf("当前记录条数:%d\n",num);
        //计算列数
        int m=mysql_field_count(mysql);
        printf("一行记录有%d列\n",m);
        //循环打印
        for(int i=0;i<num;i++)
        {
           //获取一行记录,通常是需要循环的,但是当前数据表中只有一条记录,所以没有进行循环
           MYSQL_ROW mysql_row=mysql_fetch_row(mysql_res);
           //printf("name=%s,age=%s\n",mysql_row[0],mysql_row[1]);
           //循环打印各个列
           for(int j=0;j<m;j++)
           {
               printf("row[%d]=%s ",j,mysql_row[j]);
           }
           printf("\n");
        }
    }

    //释放结果集
    mysql_free_result(mysql_res);
    mysql_close(mysql);
}

③程序运行结果:

c 做界面连接mysql数据库 c语言怎么连接mysql数据库_linux_07