简单易用的mysql c api 封装类
来源:互联网 发布:哔哩哔哩for mac 编辑:程序博客网 时间:2024/06/05 14:08
本文参考mysql官方文档(http://dev.mysql.com/doc/refman/5.6/en/c-api.html),对MySQL C API 简单的C++封装。欢迎大家批评指正。
1.源码文件:
#ifndef _MY_SQL_DB_H_#define _MY_SQL_DB_H_#include <windows.h>#include <winsock2.h>#include <string>#include <map>#include "mysql.h"using namespace std;class CMySQLDB{public:CMySQLDB();~CMySQLDB();my_bool BeginTransaction();my_bool CommitTransaction();my_bool RollbackTransaction(); my_bool EndTransaction();int OpenDB(const char *host,const char *user,const char *passwd,const char *db,unsigned int port);int ExecuteSQL(const string& sql);int NextRow();bool IsEndOfRow();int SeekRow(my_ulonglong offset);string GetValue(int fieldIndex);string GetValue(const string& fieldName);my_ulonglong GetNumRows(){ return m_num_rows; }unsigned int GetNumFields(){ return m_num_fields; }private:int Initialize();void ResetQuery();HANDLE m_hMutex;MYSQL*m_mySQL_CON;MYSQL_RES*m_mySQL_RES;MYSQL_ROWm_mySQL_ROW;my_ulonglong m_num_rows;unsigned int m_num_fields;map<string,int> m_name2IndexMap;};#endif // _MY_SQL_DB_H_
#include "StdAfx.h"#include "MySQLDB.h"#pragma comment(lib, "libmysql.lib")CMySQLDB::CMySQLDB(): m_mySQL_CON(NULL), m_mySQL_RES(NULL), m_mySQL_ROW(NULL){m_num_rows = 0;m_num_fields = 0;m_hMutex = CreateMutex(NULL,FALSE,_T("MYSQLDBMUTEX"));Initialize();}int CMySQLDB::Initialize(){WaitForSingleObject(m_hMutex,INFINITE);int res = mysql_library_init(0,NULL,NULL);if (res==0){m_mySQL_CON = mysql_init(NULL);if (NULL == m_mySQL_CON){ReleaseMutex(m_hMutex);return -1;}my_bool reConnect = 1;res = mysql_options(m_mySQL_CON,MYSQL_OPT_RECONNECT,&reConnect);}ReleaseMutex(m_hMutex);return res;}CMySQLDB::~CMySQLDB(){if (m_hMutex != INVALID_HANDLE_VALUE){CloseHandle(m_hMutex);m_hMutex = INVALID_HANDLE_VALUE;}if (m_mySQL_CON){mysql_close(m_mySQL_CON);m_mySQL_CON = NULL;}mysql_library_end();}int CMySQLDB::OpenDB(const char *host, const char *user, const char *passwd, const char *db, unsigned int port){if (mysql_real_connect(m_mySQL_CON,host,user,passwd,db,port,NULL,0)){return mysql_set_character_set(m_mySQL_CON,"GBK");}return -1;}int CMySQLDB::ExecuteSQL( const std::string& sql ){ResetQuery();if (mysql_query(m_mySQL_CON,sql.c_str()) == 0){m_mySQL_RES = mysql_store_result(m_mySQL_CON);if (NULL != m_mySQL_RES){m_num_rows = mysql_num_rows(m_mySQL_RES);m_mySQL_ROW = mysql_fetch_row(m_mySQL_RES);MYSQL_FIELD* field = mysql_fetch_fields(m_mySQL_RES);m_num_fields = mysql_num_fields(m_mySQL_RES);for (int i = 0; i<m_num_fields;++i){m_name2IndexMap.insert(std::pair<std::string,int>(field[i].name,i));}}else{if (mysql_field_count(m_mySQL_CON) == 0){return 0;}}}return -1;}void CMySQLDB::ResetQuery(){if (NULL != m_mySQL_RES){mysql_free_result(m_mySQL_RES);m_mySQL_RES = NULL;}m_mySQL_ROW = NULL;m_num_rows = 0;m_num_fields = 0;m_name2IndexMap.clear();}string CMySQLDB::GetValue(int fieldIndex){string value;if (fieldIndex>= 0 && fieldIndex < m_num_fields){if (m_mySQL_ROW){if (NULL != m_mySQL_ROW[fieldIndex])value = m_mySQL_ROW[fieldIndex];}}return value;}string CMySQLDB::GetValue(const string& fieldName){string value;int index = -1;for (map<string,int>::iterator iter = m_name2IndexMap.begin();iter != m_name2IndexMap.end();++iter){if (fieldName == iter->first){index = iter->second;break;}}return GetValue(index);}int CMySQLDB::NextRow(){m_mySQL_ROW = mysql_fetch_row(m_mySQL_RES);if (m_mySQL_RES == NULL)return -1;return 0;}bool CMySQLDB::IsEndOfRow(){return m_mySQL_ROW == NULL;}int CMySQLDB::SeekRow( my_ulonglong offset ){if (offset< 0 || offset >= m_num_rows)return -1;mysql_data_seek(m_mySQL_RES,offset);m_mySQL_ROW = mysql_fetch_row(m_mySQL_RES);if (m_mySQL_ROW == NULL)return -1;return 0;}my_bool CMySQLDB::BeginTransaction(){return mysql_autocommit(m_mySQL_CON,0);}my_bool CMySQLDB::CommitTransaction(){return mysql_commit(m_mySQL_CON);}my_bool CMySQLDB::RollbackTransaction(){return mysql_rollback(m_mySQL_CON);}my_bool CMySQLDB::EndTransaction(){return mysql_autocommit(m_mySQL_CON,1);}
2. 如何使用
在需要的地方包含该头文件:MySQLDB.h
代码示例:
CMySQLDB db;db.OpenDB("localhost","root","root","mysqlbzbh",3306);string sql = "select * from customers";db.ExecuteSQL(sql);string strValue;while (!db.IsEndOfRow()){for (unsigned int i = 0; i< db.GetNumFields();++i) { strValue = db.GetValue(i); // 按照索引 TRACE(CString(strValue.c_str())); }db.NextRow();}db.SeekRow(0);while (!db.IsEndOfRow()){strValue = db.GetValue("cust_address"); // 按照字段名TRACE(CString(strValue.c_str()));db.NextRow();}
0 0
- 简单易用的mysql c api 封装类
- Linux mysql c API封装
- C++封装MySQL C API
- C++封装 mysql C api遇到的问题
- MYSQL简单的封装
- sqlite3 api的简单封装
- Mysql数据库学习(四):常用Mysql C API 介绍和使用、封装一个访问Mysql数据库的类MysqlDB
- java的mysql api封装
- 封装MySQL C API 基本操作
- C++封装MySQL预处理C API
- PHP MySQL工具类的简单封装
- 重温WIN32 API ------ 最简单的Windows窗口封装类
- 对mysql的简单封装
- MYSQL C API的简单应用 windows下
- MYSQL C API 封装和MYSQL连接池
- C++封装mysql的基本API
- PHP 简单mysql封装类
- PHP+MySql实现的简单分页类的封装
- POJ 2114 Boatherds 点分治
- Android 自定义圆形图片和文本
- 关于ArcGIS Engine与Runtime
- 黑马day18 JQuery自定义插件
- Redis简介
- 简单易用的mysql c api 封装类
- Ubuntu12.04 安装PyCharm
- Android ListView滑动过程中控件显示重复/错误问题之原理分析...
- 细说LoadRunner参数化(转)
- 从密码学角度看腾讯常用的TEA加密算法
- 编码占位
- 【Struts2一】入门
- android ndk jni 字符串 String jstring
- gdb调试带参数程序