MySQL在C语言程序中使用的API

程序源码地址 : https://github.com/duchenlong/linux-text/tree/master/mysql

对于不涉及到打印表格的操作,他的设计流程是这样的(插入,更新,删除数据)
在这里插入图片描述

而对于查找的操作,在执行sql语句后,打印表格时多了以下几个步骤
在这里插入图片描述

1. 初始化操作句柄

MYSQL * mysql_init(MYSQL *mysql);    // 初始化一个MYSQL 连接的实例对象

所传的参数 mysql

  • 如果mysql是NULL指针,该函数将分配空间、初始化、并返回新对象的首地址。
  • mysql不为NULL,那么将初始化对象,并返回该对象的首地址

一般我们所传的参数为NULL,获得开辟后的mysql操作句柄

    //初始化句柄
    MYSQL* mysql_fd = mysql_init(NULL);

2. 建立连接

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 client_flag) 

mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接,在执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。
在这里插入图片描述
这个函数有多个参数,利用这些参数,需要完成和指定机器中数据库进行连接

  • MYSQL *mysql,数据库操作句柄
  • const char *host,ip地址,如果host为NULL 或字符串localhost,则假定与本地主机的连接
  • const char *user,登录用户名
  • const char *passwd,密码
  • const char *db,数据库名
  • unsigned int port, 端口号,如果port不是0,其值将用作TCP/IP连接的端口号
  • const char *unix_socket,一般为NULL,而如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道
  • unsigned long client_flag,一般为0,也可以为下表中的数据
client_flag功能
CAN_HANDLE_EXPIRED_PASSWORDS客户端可以处理过期的密码
CLIENT_COMPRESS在客户端/服务器协议中使用压缩
CLIENT_FOUND_ROWS返回找到(匹配)的行数,而不是更改的行数
CLIENT_IGNORE_SIGPIPE防止客户端库安装 SIGPIPE信号处理程序。这可以用来避免与应用程序已经安装的处理程序发生冲突
CLIENT_IGNORE_SPACE在函数名称后允许空格。使所有函数名称保留字
CLIENT_INTERACTIVE在关闭连接之前,允许 interactive_timeout 闲置几秒钟(而不是 wait_timeout几秒钟)。客户端的会话wait_timeout变量设置为会话 变量的值 interactive_timeout 。
CLIENT_LOCAL_FILES启用 LOAD DATA LOCAL处理
CLIENT_MULTI_RESULTS告诉服务器客户端可以处理来自多个语句执行或存储过程的多个结果集。如果CLIENT_MULTI_STATEMENTS启用,则自动启用此标志 。有关此标志的更多信息,请参见此表后面的注释
CLIENT_MULTI_STATEMENTS告诉服务器客户端可以在单个字符串(用; 字符分隔)中发送多个语句。如果未设置此标志,则禁用多语句执行。有关此标志的更多信息,请参见此表后面的注释。
CLIENT_NO_SCHEMA不允许 db_name.tbl_name.col_name 语法
CLIENT_SSL使用SSL(加密协议)。不要在应用程序中设置此选项。它在客户端库中内部设置。而是在呼叫之前 使用 mysql_options()或 。 mysql_ssl_set()mysql_real_connect()
CLIENT_REMEMBER_OPTIONS由调用指定的选项 mysql_options()。如果没有此选项,则如果 mysql_real_connect() 失败,则必须重拨 mysql_options()呼叫,然后再尝试重新连接。使用此选项, mysql_options()无需重复通话。

如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同

    //建立连接
    //参数依次为 数据库操作句柄 ip地址 登录用户名 密码 数据库名 端口号
    // unix_socket --》 置NULL
    // client_flag --》 置0
    if(mysql_real_connect(mysql_fd,"127.0.0.1","root","266448",
                "blog_system",3306,NULL,0) == NULL)
    {
        printf("连接失败,错误信息为:[%s]\n",mysql_error(mysql_fd));
        return 0;
    }

3. 设置数据库的编码格式

    //设置编码格式
    mysql_set_character_set(mysql_fd,"utf8");

设置数据库的编码格式,如果有汉字的话,就设置为utf8的数据格式

4. 执行SQL语句

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

在执行SQL语句之前,我们需要先完善该函数的第二个参数。这个参数就是需要在数据库中进行操作的指令,我们按照拼接的方式进行

void  Insert(char* buf)
{             
    //插入数据                                                                                             
#define INSERT_TAG_INFO "insert into tag_blog values (%d,'%s')"
    sprintf(buf,INSERT_TAG_INFO,3,"java 语言");
}
void Select(char* buf)
{
#define SELECT_TAG_INFO "select * from tag_blog;"
    sprintf(buf,SELECT_TAG_INFO);
}


然后在主函数中调用该函数就可以了

    char buf[1024] = {'\0'};
    //Insert(buf);
    Select(buf);
    //执行sql语句
    int ret = mysql_query(mysql_fd,buf);
    if(ret < 0)
    {
        printf("连接失败,错误信息为:[%s]\n",mysql_error(mysql_fd));
        return 0;
    }

如果查询成功,返回0。如果出现错误,返回非0值

5. 查询数据的打印

先根据操作句柄,得到数据库表格中的数据

MYSQL_RES *mysql_store_result(MYSQL *mysql) 

mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。

  • 如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。

  • 如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。

  • 如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。

    //遍历查询结果
    MYSQL_RES* result = mysql_store_result(mysql_fd);
    if(result == NULL)
    {
        printf("查询失败,错误信息为:[%s]\n",mysql_error(mysql_fd));
        return 0;
    }

得到数据库表格的行数,和列数

    //获取行数和列数
    int row = mysql_num_rows(result);
    int col = mysql_num_fields(result);  

进行结果遍历,与释放结果集

    //打印结果
    for(int i = 0; i < row; i++)
    {
        MYSQL_ROW r = mysql_fetch_row(result);
        for(int j = 0; j < col; j++)
            printf("%s\t",r[j]);
        printf("\n");
    }

    //释放结果集
    mysql_free_result(result); 

6. 关闭数据库操作句柄

void mysql_close(MYSQL *mysql) 

关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。

mysql_close(mysql_fd);

数据库表格打印的结果

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用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连接并退出程序。 当然,具体的数据库操作还需要根据实际需求进行调整和完善,如异常处理、批量操作等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值