首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

本人对MYSQL C API做的一个封装,希望对linux C++程序员有点帮助,同时欢迎拍砖!该怎么解决

2012-02-29 
本人对MYSQLC API做的一个封装,希望对linux C++程序员有点帮助,同时欢迎拍砖!本人对MYSQLCAPI做的一个封装

本人对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++吧

热点排行