• C语言定义的操作mysql数据库的接口


    编写的环境:centos7系统下,对mysql的衍生mariadb进行数据库的操作,包含设置访问数据库的参数,查询数据库和增删改数据库的三个功能。对于查询数据库,我这里允许不返回查询结果,用于判断查询是否成功的功能编写上。

    先上头文件

     1 /* 该文件用于描述访问数据库的接口声明 */
     2 #ifndef _OPERATE_DB_H_
     3 #define _OPERATE_DB_H_
     4 //#include <winsock.h> /* windows系统要加上这个 */
     5 #include <mysql.h>
     6 #include "status.h"
     7 
     8 /*
     9  * 访问数据库的字符串的最大长度
    10  */
    11 #define QUERY_MAX_SIZE 1024
    12 
    13 /*
    14  * 设置访问数据库参数
    15  * _localhost -- 访问数据库的主机名
    16  * _userName -- 访问数据库的用户名
    17  * _password -- 对应的密码
    18  * _databaseName -- 要操作的数据库名字
    19  * 返回结果状态值,如果没有异常返回OK;否则返回ERROR
    20  */
    21 STATUS
    22 InitDbParms( char const *_localhost, char const *_userName, char const *_password, char const *_databaseName );
    23 
    24 /*
    25  * 操作数据库
    26  * commandString -- 存放SQL操作命令
    27  * 如果操作成功返回OK;否则返回ERROR
    28  */
    29 STATUS
    30 UpdateDatabase( char const *commandString );
    31 
    32 /*
    33  * 查询数据库
    34  * commandString -- 查询sql命令
    35  * resultp -- 指向存放查询结果的双指针(如果传递给该参数NULL,则函数不会返回查询结果)
    36  * 返回结果状态值,如果操作成功返回OK;否则返回ERROR
    37  */
    38 STATUS
    39 QueryDatabase( char const *commandString, MYSQL_RES **resultpp );
    40 
    41 /*
    42 ** 释放掉mysql查询的结果所占内存
    43 **
    44 ** storagepp -- 指向存放结果的内存的双指针
    45 ** 返回空。
    46 */
    47 void
    48 FreeTheSearchStorage(MYSQL_RES **storagepp);
    49 #endif

    再上接口文件

     1 /* 该文件用于描述访问数据库的接口声明 */
     2 #ifndef _OPERATE_DB_H_
     3 #define _OPERATE_DB_H_
     4 #include <mysql.h>
     5 #include "status.h"
     6 
     7 /*
     8  * 访问数据库的字符串的最大长度
     9  */
    10 #define QUERY_MAX_SIZE 1024
    11 
    12 /*
    13  * 设置访问数据库参数
    14  * _localhost -- 访问数据库的主机名
    15  * _userName -- 访问数据库的用户名
    16  * _password -- 对应的密码
    17  * _databaseName -- 要操作的数据库名字
    18  * 返回结果状态值,如果没有异常返回OK;否则返回ERROR
    19  */
    20 STATUS
    21 InitDbParms( char const *_localhost, char const *_userName, char const *_password, char const *_databaseName );
    22 
    23 /*
    24  * 操作数据库
    25  * commandString -- 存放SQL操作命令
    26  * 如果操作成功返回OK;否则返回ERROR
    27  */
    28 STATUS
    29 UpdateDatabase( char const *commandString );
    30 
    31 /*
    32  * 查询数据库
    33  * commandString -- 查询sql命令
    34  * resultp -- 指向存放查询结果的双指针(如果传递给该参数NULL,则函数不会返回查询结果)
    35  * 返回结果状态值,如果操作成功返回OK;否则返回ERROR
    36  *再上接口定义
    #include <stdio.h>
    #include <stdlib.h>
    //#include <winsock.h> /* windows系统要加上这个 */
    #include <mysql.h>
    #include "operateDb.h"
    #include "status.h"

    /*
     * 内部数据
     */
    static char const *localhost = NULL; //主机名
    static char const *userName = NULL;  //mysql用户名
    static char const *password = NULL;  //它的密码
    static char const *databaseName = NULL; //所要操作的数据库

    /*
     * 外部接口
     *
     *
     * 设置访问数据库参数
     * _localhost -- 访问数据库的主机名
     * _userName -- 访问数据库的用户名
     * _password -- 对应的密码
     * _databaseName -- 要操作的数据库名字
     * 返回结果状态值,如果没有异常返回OK;否则返回ERROR
     */
    STATUS
    InitDbParms( char const *_localhost, char const *_userName, char const *_password, char const *_databaseName )
    {
            if(_localhost == NULL) //检查参数是否有效
            {
                    fprintf(stdout, "传递给函数InitDbParms的参数_localhost无效。 ");
                    return ERROR;
            }
            if(_userName == NULL)
    {
                    fprintf(stdout, "传递给函数InitDbParms的参数_userName无效。 ");
                    return ERROR;
            }
            if(_databaseName == NULL)
            {
                    fprintf(stdout, "传递给函数InitDbParms的参数_databaseName无效。 ");
                    return ERROR;
            }

            localhost = _localhost;
            userName = _userName;
            password = _password;
            databaseName = _databaseName;
            return OK;
    }

    /*
     * 操作数据库
     * commandString -- 存放SQL操作命令
     * 如果操作成功返回OK;否则返回ERROR
     */
    STATUS
    UpdateDatabase( char const *commandString )
    {
            MYSQL the_conn;

            if(commandString == NULL) //检查参数是否有效
           {
                    fprintf(stdout, "传递给函数UpdateDatabase的参数commandString无效。 ");
                    return ERROR;
            }

            if( mysql_init( &the_conn ) == NULL ) //获取本次连接的句柄
            {
                    fprintf(stdout, "Error at mysql_init(). ");
                    exit( EXIT_FAILURE );
            }

            if( mysql_real_connect( &the_conn, localhost, userName, password, databaseName, MYSQL_PORT, NULL, 0 ) == NULL ) //连接数据库
            {
                    fprintf(stdout, "Error at mysql_real_connect(). ");
                    exit( EXIT_FAILURE );
            }

            if( mysql_query( &the_conn, commandString ) != 0 ) //操作数据库
            {
                    fprintf(stdout, "Error at mysql_query(). ");
                    exit(EXIT_FAILURE);
            }
            mysql_close( &the_conn ); //断开连接
            return OK;
    }

    /*
     * 查询数据库
     * commandString -- 查询sql命令
     * resultpp -- 指向存放查询结果的双指针,注意,如果该参数为NULL,则程序不返回查询的结果。
     * 返回结果状态值,如果操作成功返回OK;否则返回ERROR
     */
    STATUS
    QueryDatabase( char const *commandString, MYSQL_RES **resultpp )
    {
            MYSQL the_conn;
            MYSQL_RES *resultp = NULL;

            if(commandString == NULL) //检查参数是否有效
            {
                    fprintf(stdout, "传递给函数QueryDatabase的参数commandString无效。 ");
                    return ERROR;
            }

            if(mysql_init( &the_conn ) == NULL) //获取本次连接的句柄
            {
                    fprintf(stdout, "Error at mysql_init(). ");
                    exit( EXIT_FAILURE );
            }

            if(mysql_real_connect( &the_conn, localhost, userName, password, databaseName, MYSQL_PORT, NULL, 0 ) == NULL) //连接数据库
            {
                    fprintf(stdout, "Error at mysql_real_connect(). ");
                    exit( EXIT_FAILURE );
            }

            if(mysql_query( &the_conn, commandString ) != 0) //操作数据库
            {
                    fprintf(stdout, "Error at mysql_query(). ");
                    exit( EXIT_FAILURE );
            }

            resultp = mysql_store_result(&the_conn); //获取查询结果
            mysql_close(&the_conn); //断开连接

            if( mysql_num_rows(resultp) != 0 ) //如果查询结果个数不为0
            {
                    if(resultpp == NULL) //判断是否需要返回查询结果
                    {
                            mysql_free_result(resultp);
                    }
                    else
                    {
                            *resultpp = resultp; //返回查询结果
                    }
                    return OK;
            }
            else
            {
                    if(resultpp == NULL)
                    {
                            mysql_free_result(resultp);
                    }
                    else
                    {
                            *resultpp = resultp;
                            resultp = NULL;
                    }
                    return ERROR;
            }
    }

    /*
    ** 释放掉mysql查询的结果所占内存
    **
    ** storagepp -- 指向存放结果的内存的双指针
    ** 返回空。
    */
    void
    FreeTheSearchStorage(MYSQL_RES **storagepp)
    {
        MYSQL_RES *storagep = NULL;

        if(storagepp != NULL)
        {
            storagep = *storagepp;
            if(storagep != NULL)
            {
                mysql_free_result(storagep);
                storagep = NULL;
                *storagepp = storagep;
            }
        }
    }

  • 相关阅读:
    linux打包解压包(.tar .gz .tar.gz .zip)
    centos安装fusesshfs通过挂载目录实现数据双向同步
    WSL远程访问Windows下的MySQL方法
    Linux中hugepage的使用方法
    Python科普系列——类与方法(下篇)
    Treevalue(0x02)——函数树化详细解析(上篇)
    Treevalue(0x03)——函数树化详细解析(下篇)
    Python科普系列——类与方法(上篇)
    个人网站迁移之旅:从博客到知识库,从 Hexo 到 Docusaurus
    wpf 动画结束后保留end值,动画结束后会失去绑定,可以在completed事件重新进行绑定
  • 原文地址:https://www.cnblogs.com/the-one/p/7620397.html
Copyright © 2020-2023  润新知