下面是编程之家 jb51.cc 通过网络收集整理的代码片段。
编程之家小编现在分享给大家,也给大家做个参考。
先看 @红薯 写的 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"\r\n",__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!\r\n",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 !!!***\r\n"); 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 !!!***\r\n"); 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!!!***\r\n"); 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("%s\t%s\t%s\n",r[0],r[1],r[2]); return 0; }
以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。