用C语言API(常用)操作MySql数据库

连接数据库的步骤

MySql数据库是一个典型的C/S结构,包括客户端和服务器。当部署好了MySql服务器,想通过程序访问服务端的数据,在编写程序的时候,可以通过官方提供的C语言API来实现。
    在程序中连接MySql服务器主要分为以下几个步骤:

  1. 初始化连接环境
  2. 连接MySql服务器。需要提供如下连接数据:
    1. MySql服务器IP地址
    2. MySql服务器监听端口。默认是3306
    3. 连接MySql服务器使用的用户名(默认是root)和对应用户的密码。
    4. 需要操作的数据库名字
  3. 连接已经建立,后续操作就是对数据库数据进行增删查改。
    1. 这些操作都需要通过sql语句来完成。
    2. 数据的查询:通过调用api指定一个查询语句
    3. 数据的修改(增/删/改):通过调用api来执行修改数据的sql语句
  4. 如果要进行事务的处理
    1. 需要对执行的结果进行判断。
      1. 成功:提交事务
      2. 失败:数据回滚
  5. 查询数据进行数据库的读操作,得到数据的结构集。
  6. 遍历结构集,得到查询的数据。
  7. 释放资源。

MySql C语言API

初始化数据库

MYSQL* mysql_init(MYSQL* mysql)

 参数:mysql填写null

返回值:返回一个MYSQL初始化的新对象地址。可以用该指针来连接MySql服务器,并操作对应数据库。如果没有足够内存分配新对象,返回NULL。

实际是用结构体对MySql数据库进行描述,实例化并初始化该类型的对象,在内存中开辟空间。

连接MySql数据库

MYSQL* mysql_real_connect(
MYSQL* mysql,            //mysql_init()函数返回值
const char* host,        //mysql服务器主机地址,写IP地址即可
                         //localhost,null 代表本地连接
const char* user,        //连接mysql服务器的用户名,默认root
const char* passwd,      //对应用户名的密码
const char* db,          //要操作的数据库名
unsigned int port,       //连接的mysql服务器监听的端口
                         //==0使用默认端口3306,
const char* unix_socket, //本地套接字,不使用指定为NULL
unsigned long client_flag//通常指定为0
);

作用:连接对应ip主机上对应端口的mysql服务。

返回值:

        成功:返回MYSQL*连接句柄,与函数的第一个参数值相同。指向同一块空间。

        失败:返回NULL

执行sql语句

int mysql_query(MYSQL* mysql, const char* query);

参数:

        mysql:mysql_real_connect()返回值

        query:增删查改的sql语句,结尾不需要加 ';'

返回值:

        如果执行成功,返回0。如果是查询,结果集保存在mysql对象中。

        如果出错,返回非0值。

获取结果集 

MYSQL_RES* mysql_store_result(MYSQL* mysql);

作用:将结果集从参数(mysql)对象中取出。得到所有信息。

返回值:具有多个结果的MYSQL_RES结果的集合。出现错误返回NULL。

说明:

        1. 结果集用MYSQL_RES描述。调用该函数,在内存中新开辟空间,里面保存从参数mysql取出的结果集。

        2. 结果集中包括行和列的数据,(相当于一个二维数组)。找到某一个数据,就是找到对应行和列的位置。将行和列的数据从结果集中取出,需要使用其他函数。

得到结果集的列数

unsigned int mysql_num_fields(MYSQL_RES* result);

作用:获得结果集中列的个数。

参数:调用mysql_store_result()得到的返回值。

返回值:结果集中的列数。

比如下面数据库中的表,调用该函数会返回4列。

 获取表头,列名

MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES* result);

参数:mysql_store_result()函数返回值。

返回值:返回一个结构体指针(数组),保存结果集中的所有列信息。该结构体描述的是返回结果集中的列信息。

返回值 MYSQL_FIELD 对应的是一个结构体,在 mysql.h 中定义如下:

// mysql.h
// 结果集中的每一个列对应一个 MYSQL_FIELD
typedef struct st_mysql_field {
  char *name;                 /* 列名-> 字段的名字 */
  char *org_name;             /* Original column name, if an alias */
  char *table;                /* Table of column if column was a field */
  char *org_table;            /* Org table name, if table was an alias */
  char *db;                   /* Database for table */
  char *catalog;              /* Catalog for table */
  char *def;                  /* Default value (set by mysql_list_fields) */
  unsigned long length;       /* Width of column (create length) */
  unsigned long max_length;   /* Max width for selected set */
  unsigned int name_length;
  unsigned int org_name_length;                                                                                        
  unsigned int table_length;
  unsigned int org_table_length;
  unsigned int db_length;
  unsigned int catalog_length;
  unsigned int def_length;
  unsigned int flags;         /* Div flags */
  unsigned int decimals;      /* Number of decimals in field */
  unsigned int charsetnr;     /* Character set */
  enum enum_field_types type; /* Type of field. See mysql_com.h for types */
  void *extension;
} MYSQL_FIELD;

举例:获得结果集中的所有列名。

//获得所有结果集的列信息
MYSQL_FIELD* fields = mysql_fetch_fields(res);
//获得列数
unsigned int num = mysql_num_fields(res);

for(int i = 0; i < num; ++i)
{
    printf(""当前列的名字: %s\n", fields[i].name);
} 

获得结果集中的数据

typedef char** MYSQL_ROW;

MYSQL_ROW mysql_fetch_row(MTSQL_RES* result);

参数:通过查询得到的结果集

返回值:

        成功得到当前行所有列的字段

        失败返回NULL,说明数据读完了。

说明:

        1. 返回值类型为char**,实际是char* [],数组里面保存的是当前行所有列的值。所有,对返回值遍历,可以得到当前行的所有值。

        2. 如果想遍历郑国结果集,即得到所有结果,需要循环调用该函数,走到下一行,直到走到NULL。 

得到结果集中的字段长度

unsigned long* mysql_fetch_lengths(MYSQL_RES* result);

作用:获得结果集当前行,所有列的数据的字段长度。

返回值:是一个数组,保存当前行所有列数据的长度。失败返回null。

说明:为什么需要这个接口,由于C语言中字符串以'\0'结尾,当保存的数据是二进制形式时,可能中间保存着的值为'\0',安装字符串读取时导致后面的字符丢失了。

        1. 如果打算复制字段值,使用strlen()计算长度,二进制形式保存的数据,可能导致数据丢失。

        2. 该接口可以正确返回字符串长度,不管中间有没有'\0'。

资源回收

需要回收的资源:

        1. 初始化Mysql时开辟的空间,即mysql实例对象。

        2. 返回的结果集。

列名和数据值不需要释放,因为实际指向的空间都是结果集中的。

// 释放结果集
void mysql_free_result(MYSQL_RES *result);

// 关闭mysql实例
void mysql_close(MYSQL *mysql);

字符编码

        设置编码形式为UTF-8,避免中文出现乱码。

// 获取api默认使用的字符编码
// 为当前连接返回默认的字符集。
const char *mysql_character_set_name(MYSQL *mysql) 
// 返回值: 默认字符集。 

// 设置api使用的字符集
// 第二个参数 csname 就是要设置的字符集 -> 支持中文: utf8
int mysql_set_character_set(MYSQL *mysql, char *csname);

事务操作

// mysql中默认会进行事务的提交
// 因为自动提交事务, 会对我们的操作造成影响
// 如果我们操作的步骤比较多, 集合的开始和结束需要用户自己去设置, 需要改为手动方式提交事务
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode) 

参数:
    如果模式为“1”,启用autocommit模式;如果模式为“0”,禁止autocommit模式。

    如果我们要开启一个事务,并且会进行多次增删改操作,一般我们禁用autocommit模式。
返回值:
    如果成功,返回0,如果出现错误,返回非0值。

// 事务提交
my_bool mysql_commit(MYSQL *mysql);
返回值: 成功: 0, 失败: 非0
    
// 数据回滚
my_bool mysql_rollback(MYSQL *mysql) 
返回值: 成功: 0, 失败: 非0

打印错误信息

// 返回错误的描述
const char *mysql_error(MYSQL *mysql);
// 返回错误的编号
unsigned int mysql_errno(MYSQL *mysql);

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用C语言MySQL数据库操作库,需要先进行以下几个步骤: 1. 下载并安装MySQL C API。可以从MySQL官方网站下载MySQL C API的安装包,然后进行安装。 2. 在C语言程序中引入MySQL C API的头文件。在C语言程序中,需要引入MySQL C API的头文件,如mysql.h。 3. 创建MySQL连接。使用mysql_init函数创建一个MySQL连接,并使用mysql_real_connect函数连接到MySQL服务器。 4. 执行SQL语句。使用mysql_query函数执行SQL语句,如SELECT、INSERT、UPDATE等。 5. 处理查询结果。如果执行的SQL语句是SELECT,则可以使用mysql_store_result和mysql_fetch_row函数来处理查询结果。 6. 关闭MySQL连接。使用mysql_close函数关闭MySQL连接。 下面是一个示例代码,用于连接MySQL数据库并查询一条记录: ``` #include <stdio.h> #include <stdlib.h> #include <mysql.h> int main(int argc, char *argv[]) { MYSQL *conn; MYSQL_RES *res; MYSQL_ROW row; char *server = "localhost"; char *user = "root"; char *password = "123456"; char *database = "test"; conn = mysql_init(NULL); if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } if (mysql_query(conn, "SELECT * FROM student WHERE id = 1")) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } res = mysql_store_result(conn); row = mysql_fetch_row(res); printf("id: %s, name: %s, age: %s\n", row[0], row[1], row[2]); mysql_free_result(res); mysql_close(conn); return 0; } ``` 上述代码连接到MySQL服务器,选择test数据库,并查询id为1的学生记录。如果连接或查询失败,则会输出错误信息。如果查询成功,则会输出该学生的id、name和age字段的值。最后,关闭MySQL连接并退出程序。 当然,具体的数据库操作还需要根据实际需求进行调整和完善,如异常处理、批量操作等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值