本人对MYSQL C API做的一个封装,希望对linux C++程序员有点帮助,同时欢迎拍砖!
本人对MYSQL C API做的一个封装,使用很简单,构造一个对象,就可直接执行SQL,但对于需返回结果的查询语句,对其数据集没做封装,仍需直接调用mysql c api对其进行处理,本人将下次完成,不管如何,欢迎大家多提宝贵的意见!
//CDataBase.h
#ifndef CDATABASE_H
#define CDATABASE_H
#include "stdio.h "
#include "/usr/include/mysql/mysql.h "
#include <string.h>
class CDataBase
{
public:
CDataBase(const char *host, const char *user, const char *passwd, const char *db);
~CDataBase();
bool ExecuteSql(const char* chSql);
MYSQL_RES * OpenRecordset(const char* chSql);
void FreeResult(MYSQL_RES *result);
private:
MYSQL mysql;
bool _bOpen;
const char *_host;
const char *_user;
const char *_passwd;
const char *_db;
protected:
bool Open();
void Close();
bool GetConState();
};
#endif
------------------------------------------
//CDataBase.cpp
#include "cdatabase.h "
CDataBase::CDataBase(const char *host, const char *user, const char *passwd, const char *db)
{
_host = host;
_user = user;
_passwd = passwd;
_db = db;
_bOpen = false;
Open();
}
CDataBase::~CDataBase()
{
Close();
}
bool CDataBase::GetConState()
{
return _bOpen;
}
bool CDataBase::Open()
{
if( !mysql_init(&mysql) )
{
printf( "\nFailed to initate MySQL connection ");
return false;
}
if (!mysql_real_connect(&mysql,_host,_user,_passwd,_db,0,NULL,0))
{
printf( "Failed to connect to MySQL: Error: %s\n ", mysql_error(&mysql));
return false;
}
printf( "Logged on to database sucessfully\n ");
_bOpen = true;
return _bOpen;
}
void CDataBase::Close()
{
if(_bOpen)
{
mysql_close(&mysql);
_bOpen = false;
}
}
bool CDataBase::ExecuteSql(const char* chSql)
{
if(!GetConState())
return false;
if(mysql_real_query(&mysql,chSql,strlen(chSql))==0)
return true;
}
MYSQL_RES * CDataBase::OpenRecordset(const char* chSql)
{
MYSQL_RES *rs = NULL;
if(ExecuteSql( chSql ))
{
rs = mysql_store_result(&mysql);
}
return rs;
}
void CDataBase::FreeResult(MYSQL_RES *result)
{
if(result)
mysql_free_result(result);
}
-------------------------------------------------
//Test.cpp
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>
#include "cdatabase.h "
using namespace std;
int main(int argc, char *argv[])
{
const char *host = "127.0.0.1 ";
const char *user = "root ";
const char *pwd = NULL;
const char *dbn = "test ";
//构造对象
CDataBase *db = new CDataBase(host,user,pwd,dbn);
//创建一个张
db-> ExecuteSql( "create table tt1(id int ,name varchar(20)) ");
//插入一个数据
db-> ExecuteSql( "insert into tt1(id,name)values( '31 ', 'abc ') ");
//查询数据
MYSQL_RES *res = NULL;
MYSQL_ROW row;
res = db-> OpenRecordset( "select * from tt ");
if(res)
{
cout < < "OpenRecordset\n " < < endl;
while(row = mysql_fetch_row(res))
{
for(int t=0;t <mysql_num_fields(res);t++)
{
printf( "%s ",row[t]);
}
printf( "\n ");
}
}
db-> FreeResult(res);
delete db;
db = NULL;
return EXIT_SUCCESS;
}
[解决办法]
我做的一个, 应该比你这个好用些,呵呵. 欢迎交流 :)
http://bbs.showq.net/bbs/viewthread.php?tid=1924&extra=page%3D1
class CMysql
{
public:
CMysql();
CMysql(const char* szHost, const char* szUser, const char* szPass);
~CMysql();
int Close(); // 关闭db连接
int Connect(const char* szHost, const char* szUser, const char* szPass); // 打开连接
int Connect();
bool IfConnected(const char* szHost); // 测试是否连接
int Query(char* szSqlString);
int StoreResult(); // 保存结果集
int FreeResult(); // 释放结果集
char** FetchRow(); // 下移游标
const char* GetFieldName(int iField); // 取第N列的字段名
char* GetField(unsigned int iField); // 取第N列字段值
char* GetField(int iField); // 取第N列字段值
char* GetField(const char* szFieldName); // 按字段名取值
unsigned int GetAffectedRows(); // 取结果的行数
unsigned int GetAffectedCols() { // 取结果列数
return m_iField;
};
MYSQL* GetConnectHandle() { return &m_connection; }
const char* GetLastError() { return m_ErrMsg; }
unsigned int GetLastErrNo() {return m_nLastErrNo; }
static int EscapeString (string &str);
unsigned int GetLastInsertId();
unsigned int m_iRows;
private:
char m_ErrMsg[1024];
char m_szHost[64]; // 数据库主机名
char m_szUser[64]; // 数据库用户名
char m_szPass[64]; // 数据库用户密码
unsigned int m_iField;
MYSQL m_connection;
MYSQL_RES *m_result;
MYSQL_ROW m_row;
STRING2INT m_FieldIndex;
bool m_bFieldIndexInitialized;
bool m_bConnected;
unsigned int m_nLastErrNo;
int InitFieldName();
};
[解决办法]
都是在重新造一些有缺陷的轮子啊,你们都认为mysql++做得太差了还是怎么的?非要自己弄一个出来?当然如果是学习的目的,做做是可以的,如果真要用在实际项目中的话,劝你们还是用mysql++吧