linux下c++写的MySQL操作类
发布时间:2020-12-16 07:42:31 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 先看 @红薯 写的? Linux下MySQL C++连接操作 这个是简单的MySQL操作封装,已编译通过 编译的时候 加上参数?$(mysql_config --cflags --libs) ?或者?-L
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 先看 @红薯 写的? Linux下MySQL C++连接操作这个是简单的MySQL操作封装,已编译通过 编译的时候 加上参数?$(mysql_config --cflags --libs) ?或者?-L/usr/lib/mysql -lmysqlclient 看了这个就可以看MySQL连接池的实现。? 代码来自:在LINUX下用C/C++写了个操作MYSQL的类,挺好用。 /* * encapsulation_mysql.h * * Created on: 2013-3-28 * Author: holy */ #ifndef ENCAPSULATION_MYSQL_H_ #define ENCAPSULATION_MYSQL_H_ #include <iostream> #include <cassert> #include <set> #include <sys/shm.h> #include <string> #include <vector> #include <stdio.h> #include <string> #include <vector> #include <map> #include <time.h> #include <stdlib.h> #include <memory> #include <iconv.h> #include <dlfcn.h> #include <mysql/mysql.h> using namespace std; #define ERRMSG1(fmt,...) ; sprintf(m_szErrMsg,fmt,__VA_ARGS__); #define ERRMSG2(fmt,args...) ; sprintf(m_szErrMsg,"[%s 第 %d 行 ]; "fmt"rn",__FILE__,__LINE__,##args); namespace EncapMysql { class CEncapMysql { typedef map<string,int> MapFieldNameIndex; public: CEncapMysql(); ~CEncapMysql(); public: int Connect(const char* szDbIp,const char* szUser,const char* szPassword); void CloseConnect(); int SelectQuery(const char* szSQL); int ModifyQuery(const char* szSQL); const char* GetErrMsg(); char** FetchRow(); char* GetField(const char* szFieldName); ////////连接池那个类需要用到这3个函数。 2011-01-20 public: void SetUsed(); void SetIdle(); bool IsIdle(); //返回 true 标识 Idle private: bool m_bUseIdle; // true: use; false:idle private: bool IsConnected(); void SetConnected(bool bTrueFalse); char* GetField(unsigned int iFieldIndex); void FreePreResult(); int ReConnect(); void SaveParam(const char* szDbIp,const char* szPassword); public: bool m_bConnected; //数据库连接了吗? true--已经连接; false--还没有连接 char m_szErrMsg[1024]; //函数出错后,错误信息放在此处 int m_iFields; //字段个数 MapFieldNameIndex m_mapFieldNameIndex; //是一个map,key是字段名,value是字段索引 public: MYSQL m_connection; //连接 MYSQL_RES* m_result; //结果集指针 MYSQL_ROW m_row; //一行,typedef char **MYSQL_ROW; private: string m_sDbIp; //数据库服务器IP string m_sUser; //用户名 string m_sPassword; //口令 }; } //end of namespace EncapMysql #endif /* ENCAPSULATION_MYSQL_H_ */ /* * encapsulation_mysql.cpp * * Created on: 2013-3-28 * Author: holy */ #include <stdio.h> #include <string> #include <string.h> #include <iostream> #include <fstream> #include <vector> #include <cassert> #include <set> #include <map> #include <stdio.h> #include <dirent.h> #include <sys/types.h> #include "encapsulation_mysql.h" using namespace std; using namespace EncapMysql; CEncapMysql::CEncapMysql() { SetConnected(false); //把结果集置为空 m_result = NULL; //初始化连接 mysql_init(&m_connection); } CEncapMysql::~CEncapMysql() { //释放上一次的结果集 FreePreResult(); //关闭数据库连接 CloseConnect(); } int CEncapMysql::Connect(const char* szDbIp,const char* szPassword) { SaveParam(szDbIp,szUser,szPassword); //先判断是否已经连接了,防止重复连接 if (IsConnected()) return 0; //连接数据库 if (mysql_real_connect(&m_connection,szDbIp,szPassword,NULL,0) == NULL) { ERRMSG2("%s",mysql_error(&m_connection)); return -1; } printf("[mysql] conn to %s [user:%s] succ!rn",szUser); //设置连接标志为 true SetConnected(true); return 0; } void CEncapMysql::CloseConnect() { //不论m_connection曾经是否连接过, 这样关闭都不会有问题 mysql_close(&m_connection); SetConnected(false); } int CEncapMysql::SelectQuery(const char* szSQL) { //如果查询串是空指针,则返回 if (szSQL == NULL) { ERRMSG2("%s","szSQL==NULL"); return -1; } //如果还没有连接,则返回 if (!IsConnected()) { ERRMSG2("%s","还没有建立连接"); return -2; } try //这些语句与连接有关,出异常时就重连 { //查询 if (mysql_real_query(&m_connection,szSQL,strlen(szSQL)) != 0) { ERRMSG2("%s",mysql_error(&m_connection)); printf("%s",mysql_error(&m_connection)); printf("ReConnect() is called,select111 !!!***rn"); int nRet = ReConnect(); if (nRet != 0) return -3; // if (mysql_real_query(&m_connection,strlen(szSQL)) != 0) return -33; // } //释放上一次的结果集 FreePreResult(); //取结果集 m_result = mysql_store_result(&m_connection); if (m_result == NULL) { ERRMSG2("%s",mysql_error(&m_connection)); return -4; } } catch (...) { printf("ReConnect() is called,select !!!***rn"); ReConnect(); return -5; } //取字段的个数 m_iFields = mysql_num_fields(m_result); m_mapFieldNameIndex.clear(); //取各个字段的属性信息 MYSQL_FIELD *fields; fields = mysql_fetch_fields(m_result); //把字段名字和索引保存到一个map中 for (unsigned int i = 0; i < m_iFields; i++) { m_mapFieldNameIndex[fields[i].name] = i; } return 0; } int CEncapMysql::ModifyQuery(const char* szSQL) { //如果查询串是空指针,"还没有建立连接"); return -2; } try //这些语句与连接有关,出异常时就重连 { //查询,实际上开始真正地修改数据库 if (mysql_real_query(&m_connection,mysql_error(&m_connection)); return -3; } } catch (...) { printf("ReConnect() is called,modify!!!***rn"); ReConnect(); return -5; } return 0; } char** CEncapMysql::FetchRow() { //如果结果集为空,则直接返回空; 调用FetchRow之前,必须先调用 SelectQuery(...) if (m_result == NULL) return NULL; //从结果集中取出一行 m_row = mysql_fetch_row(m_result); return m_row; } char* CEncapMysql::GetField(const char* szFieldName) { return GetField(m_mapFieldNameIndex[szFieldName]); } char* CEncapMysql::GetField(unsigned int iFieldIndex) { //防止索引超出范围 if (iFieldIndex >= m_iFields) return NULL; return m_row[iFieldIndex]; } void CEncapMysql::FreePreResult() { if (m_result != NULL) { mysql_free_result(m_result); m_result = NULL; } } const char* CEncapMysql::GetErrMsg() { return m_szErrMsg; } bool CEncapMysql::IsConnected() { return m_bConnected; } void CEncapMysql::SetConnected(bool bTrueFalse) { m_bConnected = bTrueFalse; } void CEncapMysql::SaveParam(const char* szDbIp,const char* szPassword) { m_sDbIp = szDbIp; //数据库服务器IP m_sUser = szUser; //用户名 m_sPassword = szPassword; //口令 } int CEncapMysql::ReConnect() { CloseConnect(); //连接数据库 if (mysql_real_connect(&m_connection,m_sDbIp.c_str(),m_sUser.c_str(),m_sPassword.c_str(),mysql_error(&m_connection)); return -1; } //设置连接标志为 true SetConnected(true); return 0; } ///////////////////////// 连接池那个类需要用到这3个函数。 void CEncapMysql::SetUsed() { m_bUseIdle = true; } void CEncapMysql::SetIdle() { m_bUseIdle = false; } //如果空闲,返回true bool CEncapMysql::IsIdle() { return !m_bUseIdle; } /* * main.cpp * * Created on: 2013-3-26 * Author: holy */ #include "encapsulation_mysql.h" using EncapMysql::CEncapMysql; int main(int argc,char *argv[]) { CEncapMysql *con; con = new CEncapMysql; con->Connect("127.0.0.1","root","123456"); con->SelectQuery("select * from holy.student"); while (char** r = con->FetchRow()) printf("%st%st%sn",r[0],r[1],r[2]); return 0; } 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |