当前位置:   article > 正文

MySQL在C语言程序中使用的API_c语言apimysql

c语言apimysql

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

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

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

1. 初始化操作句柄

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

所传的参数 mysql

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

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

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

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) 
  • 1
  • 2
  • 3
  • 4

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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

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

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

4. 执行SQL语句

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

在执行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);
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

    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;
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

5. 查询数据的打印

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

MYSQL_RES *mysql_store_result(MYSQL *mysql) 
  • 1

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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

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

    //打印结果
    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); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6. 关闭数据库操作句柄

void mysql_close(MYSQL *mysql) 
  • 1

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

mysql_close(mysql_fd);
  • 1

数据库表格打印的结果

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/614131
推荐阅读
相关标签
  

闽ICP备14008679号