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