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无效。\n");
                return ERROR;
        }
        if(_userName == NULL)
{
                fprintf(stdout, "传递给函数InitDbParms的参数_userName无效。\n");
                return ERROR;
        }
        if(_databaseName == NULL)
        {
                fprintf(stdout, "传递给函数InitDbParms的参数_databaseName无效。\n");
                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无效。\n");
                return ERROR;
        }

        if( mysql_init( &the_conn ) == NULL ) //获取本次连接的句柄
        {
                fprintf(stdout, "Error at mysql_init().\n");
                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().\n");
                exit( EXIT_FAILURE );
        }

        if( mysql_query( &the_conn, commandString ) != 0 ) //操作数据库
        {
                fprintf(stdout, "Error at mysql_query().\n");
                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无效。\n");
                return ERROR;
        }

        if(mysql_init( &the_conn ) == NULL) //获取本次连接的句柄
        {
                fprintf(stdout, "Error at mysql_init().\n");
                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().\n");
                exit( EXIT_FAILURE );
        }

        if(mysql_query( &the_conn, commandString ) != 0) //操作数据库
        {
                fprintf(stdout, "Error at mysql_query().\n");
                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;
        }
    }
}

 

posted @ 2017-10-02 17:27  心中的阿哲  阅读(1112)  评论(0编辑  收藏  举报