操作mysql(封装类)
根据给定的信息,我们可以总结出以下关于VC中通过连接池操作MySQL的相关知识点: ### 操作MySQL(封装类) #### 概述 在VC++中,为了更高效地管理数据库连接并进行MySQL数据库的操作,通常会设计一个封装类来管理数据库连接池。连接池可以有效地复用已有的数据库连接,避免频繁地创建和销毁连接所导致的系统资源开销。 #### 封装类的作用 封装类的主要作用是将复杂的数据库操作简化为一系列易于调用的方法。通过这样的方式,可以方便地实现对数据库的增删查改等基本操作,并且能够更好地控制数据库连接的生命周期,提高应用程序的性能和稳定性。 #### 类的主要功能 1. **连接数据库**:`ConnectDB()`方法用于建立与MySQL数据库的连接。 2. **选择数据库**:`SelectDB()`方法用于指定当前要操作的数据库。 3. **执行查询**:`SelectRecord()`方法用于执行SELECT语句并返回查询结果。 4. **执行更新**:`UpdateRecord()`方法用于执行UPDATE语句。 5. **插入数据**:`InsertRecord()`方法用于执行INSERT语句。 6. **删除数据**:`DelRecord()`方法用于执行DELETE语句。 7. **判断查询是否结束**:`IsEnd()`方法用于判断查询结果是否已经遍历完。 8. **移动数据指针**:`SeekData()`方法用于移动查询结果中的数据指针到特定位置。 9. **释放查询结果**:`FreeRecord()`方法用于释放查询结果所占用的内存资源。 10. **获取字段数量**:`GetFieldNum()`方法用于获取查询结果中的字段数量。 11. **获取单条记录**:`GetRecord()`方法用于获取查询结果中的单条记录。 12. **获取记录总数**:`GetRowNum()`方法用于获取查询结果中的记录总数。 13. **输出错误信息**:`OutErrors()`方法用于输出MySQL操作过程中遇到的错误信息。 14. **获取服务器状态信息**:`GetState()`、`GetServerInfo()`等方法用于获取MySQL服务器的状态信息。 15. **获取客户端信息**:`GetClientInfo()`方法用于获取客户端的信息。 16. **锁定和解锁表**:`LockTable()`和`UnlockTable()`方法用于锁定和解锁MySQL中的表。 17. **设置字符集**:`SetCharset()`方法用于设置MySQL连接的字符集。 18. **获取空闲连接**:`GetIdleMySql()`方法用于从连接池中获取一个空闲的MySQL连接对象。 19. **归还连接**:`SetIdleMysql()`方法用于将使用完毕的MySQL连接对象归还到连接池中。 #### 连接池管理 1. **空闲连接列表**:`m_lsIdleList`成员变量用于存储当前未被使用的MySQL连接对象。 2. **忙连接列表**:`m_lsBusyList`成员变量用于存储当前正在被使用的MySQL连接对象。 3. **互斥量**:`m_csList`成员变量用于保证在多线程环境下连接池的安全性。 #### 类成员变量 1. **主机地址**:`m_host`用于保存MySQL服务器的主机地址。 2. **用户名**:`m_user`用于保存MySQL服务器的用户名。 3. **密码**:`m_password`用于保存MySQL服务器的登录密码。 4. **数据库名**:`m_db`用于保存当前要操作的数据库名。 5. **端口号**:`m_port`用于保存MySQL服务器的端口号,默认为3306。 #### 总结 通过上述分析可以看出,这个封装类提供了一套完整的解决方案来管理和操作MySQL数据库,包括数据库连接的建立、释放、查询、更新等一系列常用操作。同时,通过连接池技术的应用,该封装类还极大地提高了数据库操作的效率和系统的整体性能。
在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接.
一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列.
当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队列,再用这个句柄做数据库操作,完毕后一定要从使用队列中删除,再插入到空闲队列.
代码如下:
MySQLMan.h
// MySQLMan.h: interface for the CMySQLMan class.
//
//////////////////////////////////////////////////////////////////////
#include <mysql.h>
#pragma comment(lib,"libmySQL.lib")
#include <list>
typedef std::list<MYSQL *> CONNECTION_HANDLE_LIST;
typedef std::list<MYSQL *>::iterator ITER_CONNECTION_HANDLE_LIST;
#define CONNECTION_NUM 10 //同时打开的连接数
class CMySQLMan
{
public:
CMySQLMan();
CMySQLMan(const char *host, const char *user, const char *password, const char *db, unsigned int port=3306);
virtual ~CMySQLMan();
public:
bool ConnectDB(); //连接数据库
bool SelectDB(const char *szDB); //选择数据库
bool UpdateRecord(const char *szSql); //更新记录
bool InsertRecord(const char *szSql); //插入记录
bool DelRecord(const char *szSql); //删除记录
BOOL IsEnd(MYSQL_RES *myquery); //是否最后
void SeekData(MYSQL_RES *myquery, int offset); //查找指定数据
void FreeRecord(MYSQL_RES *myquery); //释放结果集
unsigned int GetFieldNum(MYSQL_RES *myquery); //得到字段数
MYSQL_ROW GetRecord(MYSQL_RES *myquery); //得到结果(一个记录)
my_ulonglong GetRowNum(MYSQL_RES *myquery); //得到记录数
char* OutErrors(MYSQL* pMySql); //输出错误信息
char* GetState(); //服务器状态
char* GetServerInfo(); //服务器信息
int GetProtocolInfo(); //协议信息
char* GetHostInfo(); //主机信息
char* GetClientInfo(); //客户机信息
char* GetFieldName(MYSQL_RES *myquery, int FieldNum); //字段名
bool LockTable(const char *TableName, const char *Priority); //对特定表加锁
bool UnlockTable(); //解锁
bool SetCharset();
//int CreateDB(char *db); //创建数据库,返回错误信息
//int DropDB(char *db); //删除数据库,返回错误信息
MYSQL* GetIdleMySql(); //提取一个空闲句柄供使用
void SetIdleMysql(MYSQL* pMySql); //从使用队列中释放一个使用完毕的句柄,插入到空闲队列
剩余13页未读,继续阅读
- 学习的天空2012-08-16正在准备做个封装,如果里面的更新操作能针对具体的类型进行操作就好了。
- 粉丝: 0
- 资源: 7
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 形状检测32-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma数据集合集.rar
- qwewq23132131231
- 2024年智算云市场发展与生态分析报告
- 冒泡排序算法解析及优化.md
- MySQL中的数据库管理语句-ALTER USER.pdf
- 论文复现:结合 CNN 和 LSTM 的滚动轴承剩余使用寿命预测方法
- 2018年最新 ECshop母婴用品商城新版系统(微商城+微分销+微信支付)
- 形状分类31-YOLO(v5至v11)、COCO、CreateML、Darknet、Paligemma、VOC数据集合集.rar
- 常见排序算法概述及其性能比较
- 前端开发中的JS快速排序算法原理及实现方法