[C++]MySQL資料庫存取函式(MySQL++)

序言

此篇為研究C++存取MySQL所寫的函式。

環境

編譯MySQL++函式庫

  1. 下載mysql++-3.1.0.tar.gz,解壓縮後可以得到[mysql++-3.1.0]目錄
  2. 進入[mysql++-3.1.0\vc2008\]目錄會找到[mysql++_mysqlpp.vcproj]專案,以Visual Studio 2008開啟
  3. 編譯時MySQL++會需要MySQL的版本定義標頭檔,函式庫預設MySQL安裝於[C:\Program Files\MySQL\MySQL Server 5.1],所以需先確認是否有[C:\Program Files\MySQL\MySQL Server 5.1\include]與[C:\Program Files\MySQL\MySQL Server 5.1\lib\opt]是否存在,如果MySQL放在其他目錄,可透過專案屬性修改
    • 開啟專案屬性
    • 展開[組態屬性→C/C++→一般],修改[其他Include目錄],指到MySQL的安裝目錄中的include資料夾
    • 展開[組態屬性→連結器→一般],修改[其他程式庫目錄],指到MySQL的安裝目錄中的lib\opt資料夾
  4. 建置專案
  5. 建置成功後會在[mysql++-3.1.0\vc2008\Debug]目錄下看到編譯完成的mysqlpp_d.dll、mysqlpp_d.lib

設定開發專案

  1. 將上一步產生的[mysqlpp_d.dll]複製到[C:\WINDOWS\system32]
  2. 於開發用的C++專案設定屬性:展開[組態屬性→C/C++→一般],修改[其他Include目錄],指到MySQL的安裝目錄中的include資料夾與mysql++函式庫的lib目錄
  3. 展開[組態屬性→連結器→一般],修改[其他程式庫目錄],指到MySQL的安裝目錄中的lib\opt資料夾與mysql++編譯後的Debug目錄
  4. 展開[組態屬性→連結器→輸入],修改[其他相依性],,增加[mysqlpp_d.lib]與 [libmysql.lib]

資料庫連線函式庫

  1. MySQLIO.h
    #pragma once
    
    #include 
    
    namespace commonio {
    
         class MySQLIO
    
         {
    
         private:
    
               mysqlpp::Connection _conn;
    
               const char* _ip;
    
               unsigned int _port;
    
               const char* _account;
    
               const char* _pswd;
    
               const char* _defaultDB;
    
               const char* _error;
    
               int _errnum;
    
         public:
    
               /**
    
               **MySQL資料庫連線物件
    
               **/
    
               MySQLIO(const char* ip,unsigned int port,const char* account,const char* pswd,const char* defaultDB);
    
               ~MySQLIO(void);
    
               /**
    
               **錯誤訊息
    
               **/
    
               const char* error();
    
               int errnum();
    
               /**
    
               **取得連線
    
               **/
    
               mysqlpp::Connection getConn(){return _conn;}
    
               /**
    
               **執行查詢
    
               **/
    
               mysqlpp::StoreQueryResult executeQuery(const char* sqlStr);
    
               /**
    
               **執行查詢
    
               **/
    
               mysqlpp::StoreQueryResult executeQuery(const char* sqlStr,mysqlpp::SQLQueryParms & param);
    
               /**
    
               **執行新增、更新、刪除
    
               **/
    
               mysqlpp::SimpleResult executeUpdate(const char* sqlStr);
    
               /**
    
               **執行新增、更新、刪除
    
               **/
    
               mysqlpp::SimpleResult executeUpdate(const char* sqlStr,mysqlpp::SQLQueryParms & param);
    
         };
    
    };
  2. MySQLIO.cpp
    #include "stdafx.h"
    
    #include "MySQLIO.h"
    
     
    
    using namespace std;
    
    using namespace commonio;
    
    MySQLIO::MySQLIO(const char* ip,unsigned int port,const char* account,const char* pswd,const char* defaultDB):_conn(false)
    
    {
    
         _ip=ip;
    
         _port=port;
    
         _account=account;
    
         _pswd=pswd;
    
         _defaultDB=defaultDB;
    
         _conn.set_option(new mysqlpp::SetCharsetNameOption("utf8") );
    
    }
    
    const char* MySQLIO::error(){return _error;}
    
    int MySQLIO::errnum(){return _errnum;}
    
    mysqlpp::StoreQueryResult MySQLIO::executeQuery(const char* sqlStr){
    
         _error=NULL;
    
         _errnum=0;
    
         
    
         try{
    
               if(!_conn.connected()) {
    
                    if(!_conn.connect(_defaultDB, _ip,
    
                         _account, _pswd,_port)){
    
                               _error=_conn.error();
    
                               _errnum=_conn.errnum();
    
                               
    
                    }
    
               }
    
               if(_conn.connected()) {
    
                    mysqlpp::Query query = _conn.query(sqlStr);
    
                    if (mysqlpp::StoreQueryResult res = query.store()) {
    
                         query.reset();
    
                         return res;
    
                    }else{
    
                         _error=query.error();
    
                         _errnum=query.errnum();
    
                         
    
                    }
    
               }
    
         }catch(const mysqlpp::ConnectionFailed &e){
    
               _error=e.what();
    
               _errnum=e.errnum();
    
         }catch(const mysqlpp::BadQuery &e){        
    
               _error=e.what();
    
               _errnum=e.errnum();
    
         }catch (const mysqlpp::BadConversion & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadFieldName & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadIndex & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadInsertPolicy & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadOption & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadParamCount & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::Exception& e) {
    
               _error=e.what();
    
         }
    
         return mysqlpp::StoreQueryResult();
    
     
    
    }
    
    mysqlpp::StoreQueryResult MySQLIO::executeQuery(const char* sqlStr,mysqlpp::SQLQueryParms & param){
    
         _error=NULL;
    
         _errnum=0;
    
         
    
         try{
    
               if(!_conn.connected()) {
    
                    if(!_conn.connect(_defaultDB, _ip,
    
                         _account, _pswd,_port)){
    
                               _error=_conn.error();
    
                               _errnum=_conn.errnum();
    
                               
    
                    }
    
               }
    
               if(_conn.connected()) {
    
                    mysqlpp::Query query = _conn.query(sqlStr);
    
                    query.parse();
    
                    if (mysqlpp::StoreQueryResult res = query.store(param)) {
    
                         query.reset();
    
                         return res;
    
                    }else{
    
                         _error=query.error();
    
                         _errnum=query.errnum();
    
                         
    
                    }
    
               }
    
         }catch(const mysqlpp::ConnectionFailed &e){
    
               _error=e.what();
    
               _errnum=e.errnum();
    
         }catch(const mysqlpp::BadQuery &e){        
    
               _error=e.what();
    
               _errnum=e.errnum();
    
         }catch (const mysqlpp::BadConversion & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadFieldName & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadIndex & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadInsertPolicy & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadOption & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadParamCount & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::Exception& e) {
    
               _error=e.what();
    
         }
    
         return mysqlpp::StoreQueryResult();
    
    }
    
     
    
     
    
    mysqlpp::SimpleResult MySQLIO::executeUpdate(const char* sqlStr){
    
         _error=NULL;
    
         _errnum=0;
    
         
    
         try{
    
               if(!_conn.connected()) {
    
                    if(!_conn.connect(_defaultDB, _ip,
    
                         _account, _pswd,_port)){
    
                               _error=_conn.error();
    
                               _errnum=_conn.errnum();
    
                    }
    
               }
    
               if(_conn.connected()) {
    
                    mysqlpp::Query query = _conn.query(sqlStr);
    
                    query.parse();
    
                    if (mysqlpp::SimpleResult res = query.execute()) {
    
                         query.reset();
    
                         return res;
    
                    }else{
    
                         _error=query.error();
    
                         _errnum=query.errnum();
    
                         
    
                    }
    
               }
    
         }catch(const mysqlpp::ConnectionFailed &e){
    
               _error=e.what();
    
               _errnum=e.errnum();
    
         }catch(const mysqlpp::BadQuery &e){        
    
               _error=e.what();
    
               _errnum=e.errnum();
    
         }catch (const mysqlpp::BadConversion & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadFieldName & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadIndex & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadInsertPolicy & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadOption & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadParamCount & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::Exception& e) {
    
               _error=e.what();
    
         }
    
         return mysqlpp::SimpleResult();
    
    }
    
     
    
    mysqlpp::SimpleResult MySQLIO::executeUpdate(const char* sqlStr,mysqlpp::SQLQueryParms & param){
    
         _error=NULL;
    
         _errnum=0;
    
         
    
         try{
    
               if(!_conn.connected()) {
    
                    if(!_conn.connect(_defaultDB, _ip,
    
                         _account, _pswd,_port)){
    
                               _error=_conn.error();
    
                               _errnum=_conn.errnum();
    
                    }
    
               }
    
               if(_conn.connected()) {
    
                    mysqlpp::Query query = _conn.query(sqlStr);
    
                    query.parse();
    
                    if (mysqlpp::SimpleResult res = query.execute(param)) {
    
                         query.reset();
    
                         return res;
    
                    }else{
    
                         _error=query.error();
    
                         _errnum=query.errnum();
    
                         
    
                    }
    
               }
    
         }catch(const mysqlpp::ConnectionFailed &e){
    
               _error=e.what();
    
               _errnum=e.errnum();
    
         }catch(const mysqlpp::BadQuery &e){        
    
               _error=e.what();
    
               _errnum=e.errnum();
    
         }catch (const mysqlpp::BadConversion & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadFieldName & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadIndex & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadInsertPolicy & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadOption & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::BadParamCount & e) {
    
               _error=e.what();
    
         }catch (const mysqlpp::Exception& e) {
    
               _error=e.what();
    
         }
    
         return mysqlpp::SimpleResult();
    
    }
    
     
    
    MySQLIO::~MySQLIO(void)
    
    {    
    
    }

使用範例

#include "stdafx.h"

#include 

#include "MySQLIO.h"

using namespace std;

using namespace commonio;

 

int main(int argc, _TCHAR* argv[])

{

     string data;

 

     MySQLIO mysqlio("localhost",3306,"root",NULL,"pklogdb");

     mysqlpp::SQLQueryParms params;

           params << 2;

     if (mysqlpp::StoreQueryResult res = mysqlio.executeQuery("select * from gametypetab where gameType=%0q",params)) {

           mysqlpp::StoreQueryResult::const_iterator it;

           mysqlpp::Row::const_iterator colit;

           for (it = res.begin(); it != res.end(); ++it) {

                mysqlpp::Row row = *it;

                cout << '\t';

                for (colit = row.begin(); colit != row.end(); ++colit) {

                     if(colit->is_null()){

                           cout << "\t (NULL)"<< endl;

                     }else{

                           string col(*colit);

                           cout << '\t' << col << endl;                         

                     }

                }

                cout << endl;

           }

           params.clear();

           string value("TEST");

           params<0){

                cerr << "success update"<< endl;

           }

     }else{

           cerr << "Failed to get item list: "<< endl;

           return 1;

     }

 

    return 0;

}

0 意見:

這裡是關於技術的手札~

也歡迎大家到

倫與貓的足跡



到噗浪來

關心一下我唷!
by 倫
 
Copyright 2009 倫倫3號Beta-Log All rights reserved.
Blogger Templates created by Deluxe Templates
Wordpress Theme by EZwpthemes