当前位置: 首页 > 图文教程 > 数据库 > MYSQL > MySQL数据库接口的VC实现与应用(2)

MYSQL
MySQL忘记密码恢复密码的实现方法
mysql 时间转换函数的使用方法
使用mysql的disctinct group by查询不重复记录
mysql备份恢复mysqldump.exe几个常用用例
超详细mysql left join,right join,inner join用法分析
mysql 5.0.67最新版替代MySQL 5.0.51b版本官方下载
比较详细的MySQL字段类型说明
mysql 记录不存在时插入 记录存在则更新的实现方法
MYSQL基础之连接MYSQL、修改密码、添加用户
mysql数据库优化必会的几个参数中文解释
mysql中文排序注意事项与实现方法
MySQL 5.0触发器参考教程
MySQL5创建存储过程的示例
MYSQL5 masterslave数据同步配置方法
mysql数据库导出xml的实现方法
MySql增加用户、授权、修改密码等语句
Mysql默认设置的危险性分析
用MySQL创建数据库和数据库表代码
Mysql如何避免全表扫描的方法
mysql的校对规则引起的问题分析

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 92 ::
收藏到网摘: n/a

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中的应用。

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函数实现的。

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

第四步 完成数据库操作。即根据需要调用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。

4 MySQL性能测试

4.1 ODBC API

通过索引读取200万行:528秒

插入35万行: 750秒

4.2 C API  

通过索引读取200万行:412秒

插入35万行:435秒

4.3 其它数据库(以MS_SQL为例,WINNT环境)  

通过索引读取200万行:1634秒

插入35万行:4012秒

注:以上数据是多次测量的平均值,不可避免一定的误差,仅供参考。  

5 结束语

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