MySQL数据库接口的VC实现与应用(2)

MySQL数据库接口的VC实现与应用(2),第1张

MySQL数据库接口的VC实现与应用(2),第2张

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(用户自定义无符号整数)等。API提供的函数有:mysql_close()、mysql_connect()、mysql_query()、mysql_store_result()、mysql_init()等。其中mysql_query()最为重要,它可以完成大部分的数据库操作。

下面将详细讨论通过C API实现数据库操作类CDatabase及其在VC中的应用。
3.1C数据库类的实现

C类封装了MySQL CDatabase的功能,所以不具有通用性,只能在MySQL应用中使用。根据C++的要求和规范,下面给出CDatabase类的具体结构和相关简介:

class c database
{
public:
BOOL unlock table();//unlock
bool锁表(char * tablename,char * priority);//lock
int Reload();//重新登录,不为零时返回错误信息
char * GetState();//服务器状态
char * GetServerInfo();//服务器信息
int GetProtocolInfo();//协议信息
char * get hostinfo();//主机信息
char * get client info();//客户端信息
char * get field name(intfield num);//字段名
BOOL IsEnd();//是否最后
int DropDB(char * db);//删除数据库,不为零时返回错误消息
void seek data(int offset);//查找指定的数据
int CreateDB(char * db);//创建数据库,不为零时返回错误信息
void FreeRecord();//释放结果集
unsigned int getfield num();//获取字段个数
Bool Connect DB(database _ param * p);//连接数据库
MYSQL _ ROW get record();//获取结果(一条记录)
my _ ulong Get rownum();//获取记录数
Bool SelectDB(data _ param * para);//选择数据库
Bool update record(data _ param * para);//更新记录
bool选择记录(data _ param * para);//Select记录
bool插入记录(data _ param * para);//Insert record
bool del record(data _ param * para);//删除记录
bool select all(data _ param * para);//Select all records
char * errors();//输出错误消息
c database();//初始化数据库
virtual ~ c database();//关闭数据库连接

private:
MYSQL MYSQL;//数据库连接句柄
MYSQL _ RES * query;//结果集
MYSQL _ ROW ROW;//记录集
MYSQL _ FIELD * FIELD;//字段信息(结构)
BOOL FindSave(char * str);//查找并保存结果集
};

通过这些在CDatabase类中定义的函数,我们可以远程或本地完成对MySQL数据库的大部分操作,并且由于定义了解锁和锁定函数,应用程序可以多线程或多进程访问数据库,大大提高了效率。以上函数的具体功能都是通过调用C API函数来实现的。
3.2C数据库类在VC中的应用

第一步是建立一个初始化MySQL对象并初始化它。即定义CDatabase类对象,这样程序会自动调用构造函数CDatabase()来完成初始化。

该构造函数实现如下:

c database::c database()
{
MySQL _ init(& MySQL);
}

要完成初始化,只需定义CDatabase类对象,即

CDatabase基础;

第二步是连接服务器和所需的数据库。即调用ConnectDB(Database_Param *p)函数,数据库参数,包括主机名、用户名、密码、数据库名等。,存储在结构Database_Param中。如果函数返回TRUE,则连接成功;否则就是失败。

连接功能实现如下:

BOOL c Database::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))
{
out errors();//输出错误消息
返回false
}
返回true
}

第三步是锁定数据库。即调用lock table (char * TableName,char * PRIORITY)锁定对应表TableName的对应属性优先级,使程序兼容多线程功能。锁定功能的实现如下:

BOOL c database::lock table(char * TableName,char * PRIORITY)
{
char str[50];
sprintf(str,"锁定表%s %s ",TableName,PRIORITY);
if(mysql_query(&mysql,str))
返回false
返回true
}
第四步:完成数据库操作。即根据需要调用UpdateRecord(Data_Param *para)、SelectRecord(Data_Param *para)、InsertRecord(Data_Param *para)、DelRecord(Data_Param *para)等操作。其中数据库操作参数存储在结构Data_Param中。以上两个结构在global.h中定义..InsertRecord函数实现如下,其他实现方法类似:

BOOL c database::insert record(Data _ Param * para)
{
char str[80];
sprintf(str," insert into %s values(%s)",para->tab_name,para-> insert _ val);
if(mysql_query(&mysql,str))
返回false
返回true
}

第5步解锁数据库。也就是说,调用UnLockTable()来解锁锁定的表。解锁功能的实现如下:

BOOL c database::UNLOCK table()
{
if(MySQL _ query(& MySQL,"解锁表"))
返回false
返回true
}

步骤6关闭数据库连接。即调用析构函数~CDatabase()关闭数据库,自动释放初始化时定义的CDatabase类对象。析构函数如下:

c database::~ c database()
{
if(query)
MySQL _ free _ result(query);
MySQL _ close(& MySQL);
}

注意:编译程序时,必须添加mySQL的库文件libmySQL.lib。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » MySQL数据库接口的VC实现与应用(2)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情