MySQL数据库接口的VC实现与利用(2)[MySQL防范]
本文“MySQL数据库接口的VC实现与利用(2)[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
作者:袁 渊
(华东船舶产业学院 机械系,江苏 镇江 212003)
转载请与作者接洽
择要:MySQL数据库作为一种网络数据库性能非常超卓,但其在利用软件中利用较少.本文将主要探究MySQL供应的两种数据库接口 ——(ODBC API和C API)在VC中的利用,并且形成一个类用以封装C API数据库接口的功效.
关键词:MySQL;数据库接口;ODBC API;C API
3 操纵MySQL自带的C API函数实现数据库功效调用
由于各个数据库之间的差别,它们所供应的数据库功效也就各有差别.这样,通过ODBC API就不大概完好拥有全部的数据库功效,因而影响了程序对数据库的掌握功效,也就不能充分施展数据库的本领.并且这种统一的接口还是以丧失效能为前提的,这就使数据库操作时间延伸.所以,为了办理以上问题,MySQL的制造商在供应ODBC驱动程序的底子上,还供应了各种编程环境下的API,此中包含C API.这些API函数很明显能尽大概地施展数据库的本领,并削减数据库操作的延伸时间,但却使程序的通用性遭到严重影响.
MySQL供应了一套C API函数,它由一组函数以及一组用于函数的数据范例构成,这些函数与MySQL 服务器举行通信并拜候数据库,可以直接操控数据库,因而明显地提高了操控效能.
C API数据范例包含:MYSQL(数据库衔接句柄)、MYSQL_RES(查询返回后果集)、MYSQL_ROW(行集)、MYSQL_FIELD(字段信息)、MYSQL_FIELD_OFFSET(字段表的偏移量)、my_ulonglong(自定义的无标记整型数)等;C API供应的函数包含:mysql_close()、mysql_connect()、mysql_query()、mysql_store_result()、mysql_init()等,此中mysql_query()最为重要,能完成绝大部份的数据库操控.
下面将具体谈论数据库操作类CDatabase通过C API的实现以及在VC中的利用.iTbulo . c om2C446
3.1 CDatabase类的实现
CDatabase类封装了MySQL数据库的功效,因此不具有通用性,只能在对MySQL的利用程序中利用.下面将按照C++要求及标准给出CDatabase类的具体构造以及相关扼要介绍:
class CDatabase
{
public:
BOOL UnLockTable(); //解锁
BOOL LockTable(char* TableName,char* PRIORITY); //加锁
int Reload(); //重新登陆,非零时返回错误信息
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); //查找并保存后果集
};
通过CDatabase类中定义的这些功效函数,我们可以通过远程或本机完成对MySQL数据库的绝大部份操控,并且由于定义理解锁和加锁功效,使得利用程序可以多线程或多进程地拜候数据库,大大提高了效能.以上函数的具体功效都是通过调用C API函数实现的.iTbulo . c om2C446
3.2 CDatabase类在VC中的利用
第一步 成立初始化MySQL对象,并且将其初始化.即定义CDatabase类对象,这样程序就会自动调用构造函数CDatabase(),完成初始化.
构造函数实现以下:
CDatabase::CDatabase ()
{
mysql_init (&mysql);
}
完成初始化只需定义CDatabase类对象,即
CDatabase base;
第二步 衔接服务器,并衔接需求的数据库.即调用ConnectDB(Database_Param *p)函数,构造体Database_Param中存放数据库参数,包含主机名、用户名、密码、数据库名等.该函数如返回TRUE表示衔接成功,不然表示失利.
衔接函数实现以下:
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;
}
第三步 对数据库举行加锁.即调用LockTable(char* TableName,char* PRIORITY),对呼应的表TableName完成呼应属性PRIORITY的加锁,使程序兼容多线程功效. 加锁函数实现以下:
BOOL CDatabase::LockTable(char* TableName,char* PRIORITY)
{
char str[50];
sprintf(str,"LOCK TABLES %s %s",TableName,PRIORITY);
if(mysql_query(&mysql,str))
return false;
return true;
}iTbulo . c om2C446
第四步 完成数据库操作.即按照需求调用UpdateRecord(Data_Param *para)、SelectRecord(Data_Param *para)、InsertRecord(Data_Param *para)、DelRecord(Data_Param *para)等操作.此中的构造体Data_Param中存放数据库操作参数.上述两个构造体的定义在global.h中. InsertRecord函数实现以下,别的实现办法类似:
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;
}
第五步 解锁数据库.即调用UnLockTable(),完成对上述被加锁的表的解锁. 解锁函数实现以下:
BOOL CDatabase::UnLockTable()
{
if(mysql_query(&mysql,"UNLOCK TABLES"))
return false;
return true;
}
第六步 关闭数据库衔接.即调用析构函数~CDatabase(),关闭数据库,并自动释放初始化时定义的CDatabase类对象. 析构函数以下:
CDatabase::~CDatabase()
{
if(query)
mysql_free_result(query);
mysql_close(&mysql);
}
注意:在编译程序时,必须加入MySQL的库文件libmySQL.lib. iTbulo . c om2C446
本文地址: | 与您的QQ/BBS好友分享! |