利用MySQL自带的C API函数实现数据库功能调用

随着现代计算机软硬件及网络技术的发展,在网上查找资料已成为现在获取信息的最重要手段之一。众所周知,所有的网上信息都是储存在网站数据库中的,这些信息的查询、更新等操作的功能则是由数据库服务器提供的,显然,数据库服务器的性能将直接关系到网站的生存。网站搭建中用的最多的数据库服务器是oracle和MySQL,前者功能强大,属于旗舰型数据库服务器,但前期投入太大;后者功能不断完善,简单易用而又不失性能,并且可以免费获得。因此,许多中小型网站的数据库服务器选用MySQL,而且,由于MySQL性能出色,一些大型网站也选用了MySQL。

      由此可见,MySQL数据库服务器在网站建设中的表现是十分出色的。但是,正因为这样,几乎很少有人将MySQL用于应用软件的开发中。本文将详细介绍VC环境中MySQL数据库服务器不同接口的应用,并最终将产生一个CDatabase类封装MySQL数据库接口功能。

利用MySQL自带的C API函数实现数据库功能调用


本程序利用VC.NET的控制台项目来实现:


实现步骤:


1、打开VC.NET,选择新建-》项目,在出现的对话框的模板中选择WIN32控制台项目,在名称中填项目名称mysqltest,在位置中选择项目放置的路径,点击确认,出现下一个对话框,直接点击完成,项目就自动生成了。


2、展开mysqltest项目,在右击头文件,选择添加新项,在出现的对话框中从右边的模板中选择头文件(.h),在名字中输入头文件的名字:database,点击打开。在database.h输入代码如下:


// Database.h: interface for the CDatabase class.
//
//
#ifndef H_DATABASE_H
#define H_DATABASE_H

#include   <stdio.h>
#include   <string.h>
#include   <winsock.h>
#include   <mysql.h>
#include   <windows.h>


struct Data_Param   //数据库操作参数
{
char *db_name;   //数据库名
char *tab_name;   //表名
char *col_name;   //列名
char *select_exp;  //选择表达式
char *where_def;  //选择限定条件
char *insert_val;  //插入值
char *set_exp;   //更新数据库内容的表达式
};


struct Database_Param  //数据库参数
{
char *host;     //主机名
char *user;     //用户名
char *password;    //密码
char *db;       //数据库名
unsigned int port;   //端口,一般为0
const char *unix_socket;  //套接字,一般为NULL
unsigned int client_flag; //一般为0
};


class CDatabase  
{
public:
char* GetState();          //服务器状态
char* GetServerInfo();     //服务器信息
int GetProtocolInfo();     //协议信息
char* GetHostInfo();       //主机信息
char * GetClientInfo();    //客户机信息
char* GetFieldName(int FieldNum);  //字段名
BOOL IsEnd();              //是否最后
int DropDB(char *db);      //删除数据库,返回错误信息
void SeekData(int offset); //查找指定数据
int CreateDB(char *db);    //创建数据库,返回错误信息
void FreeRecord();         //释放结果集
unsigned int GetFieldNum();    //得到字段数
BOOL ConnectDB(Database_Param *p);  //连接数据库
MYSQL_ROW GetRecord();     //得到结果(一个记录)
my_ulonglong GetRowNum();  //得到记录数
BOOL SelectDB(Data_Param *para);  //选择数据库
BOOL UpdateRecord(Data_Param *para); //更新记录
BOOL SelectRecord(Data_Param *para); //选择记录
BOOL InsertRecord(Data_Param *para); //插入记录
BOOL DelRecord(Data_Param *para);  //删除记录
BOOL SelectAll(Data_Param *para);  //选择所有记录
char * OutErrors();      //输出错误信息
CDatabase();
virtual ~CDatabase();


private:
MYSQL mysql;            //数据库连接句柄
MYSQL_RES *query;       //结果集
MYSQL_ROW row;          //记录集
MYSQL_FIELD *field;     //字段信息(结构体)


BOOL FindSave(char *str);    //查找并保存结果集


};


#endif





#include   <stdio.h>
#include   <string.h>
#include   <winsock.h>
#include   <mysql.h>
#include   <windows.h>


struct Data_Param   //数据库操作参数
{
char *db_name;   //数据库名
char *tab_name;   //表名
char *col_name;   //列名
char *select_exp;  //选择表达式
char *where_def;  //选择限定条件
char *insert_val;  //插入值
char *set_exp;   //更新数据库内容的表达式
};


struct Database_Param  //数据库参数
{
char *host;     //主机名
char *user;     //用户名
char *password;    //密码
char *db;       //数据库名
unsigned int port;   //端口,一般为0
const char *unix_socket;  //套接字,一般为NULL
unsigned int client_flag; //一般为0
};


class CDatabase  
{
public:
char* GetState();          //服务器状态
char* GetServerInfo();     //服务器信息
int GetProtocolInfo();     //协议信息
char* GetHostInfo();       //主机信息
char * GetClientInfo();    //客户机信息
char* GetFieldName(int FieldNum);  //字段名
BOOL IsEnd();              //是否最后
int DropDB(char *db);      //删除数据库,返回错误信息
void SeekData(int offset); //查找指定数据
int CreateDB(char *db);    //创建数据库,返回错误信息
void FreeRecord();         //释放结果集
unsigned int GetFieldNum();    //得到字段数
BOOL ConnectDB(Database_Param *p);  //连接数据库
MYSQL_ROW GetRecord();     //得到结果(一个记录)
my_ulonglong GetRowNum();  //得到记录数
BOOL SelectDB(Data_Param *para);  //选择数据库
BOOL UpdateRecord(Data_Param *para); //更新记录
BOOL SelectRecord(Data_Param *para); //选择记录
BOOL InsertRecord(Data_Param *para); //插入记录
BOOL DelRecord(Data_Param *para);  //删除记录
BOOL SelectAll(Data_Param *para);  //选择所有记录
char * OutErrors();      //输出错误信息
CDatabase();
virtual ~CDatabase();


private:
MYSQL mysql;            //数据库连接句柄
MYSQL_RES *query;       //结果集
MYSQL_ROW row;          //记录集
MYSQL_FIELD *field;     //字段信息(结构体)


BOOL FindSave(char *str);    //查找并保存结果集


};


#endif









3、展开mysqltest项目,在右击源文件,选择添加新项,在出现的对话框中从右边的模板中选择C++文件(.CPP),在名字中输入源文件的名字:database,点击打开。在database.cpp输入代码如下:


// Database.cpp: implementation of the CDatabase class.
//
//
#include "stdafx.h"
#include "Database.h"


//
// Construction/Destruction
//


CDatabase::CDatabase()
{
mysql_init(&mysql);
}


CDatabase::~CDatabase()
{
mysql_free_result(query);
mysql_close(&mysql);
}


BOOL CDatabase::SelectAll(Data_Param *para)
{
//mysql_free_result(query);
unsigned int i=0;


char str[50];
sprintf(str,"select * from %s",para->tab_name);
if(!FindSave(str))
{
  return false;
}
return true;
}


BOOL CDatabase::DelRecord(Data_Param *para)
{
char str[80];
sprintf(str,"delete from %s where %s",para->tab_name,para->where_def);
if(mysql_query(&mysql,str))
{
  return false;
}


return true;
}


BOOL CDatabase::InsertRecord(Data_Param *para)
{
char str[80];
sprintf(str,"insert into %s values(%s)",para->tab_name,para->insert_val);


if(mysql_query(&mysql,str))
{
  return false;
}


return true;
}


BOOL CDatabase::SelectRecord(Data_Param *para)
{
// mysql_free_result(query);
unsigned int i=0;
char str[80];
sprintf(str,"select %s from %s where %s",para->select_exp,para->tab_name,para->where_def);
if(!FindSave(str))
{
  return false;
}


return true;
}


BOOL CDatabase::SelectDB(Data_Param *para)
{
if (mysql_select_db(&mysql,para->db_name))
  return false;
else
  return true;
}


char * CDatabase::OutErrors()
{


return(mysql_error(&mysql));
}


BOOL CDatabase::FindSave(char *str)
{
if(mysql_query(&mysql,str))
  return false;
query=mysql_store_result(&mysql);
  return true;
}


BOOL CDatabase::UpdateRecord(Data_Param *para)
{
char str[150];

sprintf(str,"update %s set %s where %s",para->tab_name,para->set_exp,para->where_def);
if(mysql_query(&mysql,str))
{
  return false;
}
return true;
}


my_ulonglong CDatabase::GetRowNum()
{
   return (mysql_num_rows(query));
}


MYSQL_ROW CDatabase::GetRecord()
{
return (row = mysql_fetch_row(query));
}


BOOL CDatabase::ConnectDB(Database_Param *p)
{
if (!mysql_real_connect(&mysql,p->host,p->user,p->password,p->db,p->port,p->unix_socket,p->client_flag))
{
          OutErrors();
    return false;
}
return true;
}


unsigned int CDatabase::GetFieldNum()
{
return (mysql_num_fields(query));
}


void CDatabase::FreeRecord()
{
mysql_free_result(query);
}


int CDatabase::CreateDB(char *db)
{
return (mysql_create_db(&mysql,db));
}


void CDatabase::SeekData(int offset)
{
mysql_data_seek(query,offset);
}


int CDatabase::DropDB(char *db)
{
return (mysql_drop_db(&mysql,db));
}


BOOL CDatabase::IsEnd()
{
return mysql_eof(query);
}


char* CDatabase::GetFieldName(int FieldNum)
{
field=mysql_fetch_field_direct(query,FieldNum);
return field->name;
}


char * CDatabase::GetClientInfo()
{
return mysql_get_client_info();
}


char* CDatabase::GetHostInfo()
{
return mysql_get_host_info(&mysql);
}


int CDatabase::GetProtocolInfo()
{
return mysql_get_proto_info(&mysql);
}


char* CDatabase::GetServerInfo()
{
return mysql_get_server_info(&mysql);
}


char* CDatabase::GetState()
{
char* state=mysql_stat(&mysql);
if(!state)
  return OutErrors();
return state;
}


4、展开mysqltest项目,在mysqltest.cpp输入代码如下:


// mysqltest.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include "Database.h"


int _tmain(int argc, _TCHAR* argv[])
{
struct Data_Param *dp = new Data_Param();
struct Database_Param *dbp= new Database_Param();


MYSQL_ROW row;

//Database_Param 初始化参数
dbp->host = "localhost";
dbp->user = "root";
dbp->password = "";
dbp->db = "testdb";
dbp->port = 3306;
dbp->unix_socket = NULL;
dbp->client_flag = 0;


//Data_Param 初始化参数
dp->db_name = "testdb";
dp->tab_name = "user";

CDatabase cdb;
try
{
    //连接mysql数据库
    if(cdb.ConnectDB(dbp) == false)
    {
        printf("connect failed!/n");
        delete dp;
        delete dbp;
        return -1;
    }
    else
    printf("connect success!/n");


    //获得mysql版本信息
    printf("mysql version is [%s]/n",cdb.GetServerInfo());


    //查询user表
    if( !cdb.SelectAll(dp) )
        printf("select failed/n");
    else
        printf("select success/n");


    //打印user表中的数据
    printf("%s/t/t%s/t%s/t%s/n",cdb.GetFieldName(0),cdb.GetFieldName(1),cdb.GetFieldName(2),cdb.GetFieldName(3));
    while(row = cdb.GetRecord())
    {
        for (int i=0 ; i < cdb.GetFieldNum(); i++)
        {
            printf("%s/t/t",row[i]);
        }
        printf("/n");
    }


    delete dp;
    delete dbp;


}
catch(...)
{}


return 0;
}


其中连接的数据库名是testdb,用户名是root,密码为空,表名是user。


5、右击mysqltest项目,选择属性,在编译器-》命令行中加入:libmysql.lib wsock32.lib


6、下载mysql++-1.7.1-win32-vc++.zip开发包,把其中的mysql中的include和lib文件夹拷入项目的目录中,然后在VC.net的工具-》选项中的库文件和引用文件中加入上面的include和lib的绝对路径,最后把lib中的libmySQL.dll拷到项目的debug中,一切都OK了


调试-》开始执行,结果如下:


connect success!
mysql version is [5.0.7-beta-nt]
select success
userid          username        password        email
1               aaa             aaa             aaaa
2               bbb             bbbb            bbbb@sina.com
Press any key to continue


MySQL作为一个免费的SQL数据库,虽然功能不够十分强大,且灵活性较差,但是,已经能够满足一般应用软件的要求,而且MySQL数据库的开发者也在力求使之更加完善。并且,由MySQL性能测试可以看出,它对数据的处理速度明显快于其它数据库服务器。因此,如果应用软件对数据库的性能要求较高,而同时对数据库操作的功能及灵活性的要求不是很高的话,并且前期投入资金较少时,MySQL数据库服务器不失为一个最佳的选择。


希望各位成功!!!!! 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值