1. 程式人生 > >C++ 讀寫MySQL經典

C++ 讀寫MySQL經典

      看過很多C或是C++操作MySQL資料庫的文章,大部分太吃力了,甚至有一部分根本沒有很好的組織文字,初學者比較難以接受,即使是C++或是C高手也是比較難看懂。寫這篇文章的目的不是別的,就一個,告訴您用MySQL的C API直接操作MySQL資料,並做了比較高效的封裝,可以幫助開發人員大幅度提高採用MySQL的C API操作MySQL資料庫的效率。

直接進入主題:

1、  準備工作

MySQL資料庫安裝之後在/MySQL Server 5.0/lib/opt目錄下有所需要的各種檔案,我們需要的只是以下幾個:

libmysql.lib

libmysql.dll

同時需要/MySQL Server 5.0/include目錄下的幾個檔案:

mysql_version.h

my_list.h

mysql_com.h

mysql_time.h

mysql.h

my_alloc.h

typelib.h

準備Socket的基本檔案

在VC的安裝目錄Microsoft Visual Studio/VC98/Lib下找到:

WS2_32.LIB

把這些檔案先準備好

2、  使用VC的AppWizard建立一個Win32 Console Application,其實可以是Dialog工程或是其他型別工程,比如工程取名CMySQL

3、  把剛才準備好的檔案拷貝你的工程目錄下,和普通的CPP檔案在同一個目錄即可

4、  建立之後,在VC的選單欄點選Project(專案)->Settings(設定),彈出對話方塊,選擇Link標籤進入Link設定,在Object/library modules 的框裡面加入

libmysql.lib[有個空格]WS2_32.LIB

5、    在工程建立新增以下兩個檔案:

第一個檔案標頭檔案:VspdCTOMySQL.h

/****************************MYSQL IN C*******************************/

/*************************2007 -03 -07 *******************************/

/*************************李克喜**************************************/

#include <stdio.h>

#include <string>

#include <afxsock.h>

#include "mysql.h"

using   namespace   std;

class VspdCToMySQL 

{

public:

       //變數

       MYSQL mysql;

       /*

       建構函式和稀構函式

       */

       VspdCToMySQL();

       ~VspdCToMySQL();

       /*

       主要的功能:

       初始化資料庫

       連線資料庫

       設定字符集

       入口引數:

       host :MYSQL伺服器IP

       port:資料庫埠

       Db:資料庫名稱

       user:資料庫使用者

       passwd:資料庫使用者的密碼

       charset:希望使用的字符集

       Msg:返回的訊息,包括錯誤訊息

       出口引數:

       int :0表示成功;1表示失敗

       */

       int ConnMySQL(char *host,char * port,char * Db,char * user,char* passwd,char * charset,char * Msg);

       /*

       主要的功能:

       查詢資料

       入口引數:

       SQL:查詢的SQL語句

       Cnum:查詢的列數

       Msg:返回的訊息,包括錯誤訊息

       出口引數:

       string 準備放置返回的資料,多條記錄則用0x06隔開,多個欄位用0x05隔開

       如果 返回的長度= 0,責表示舞結果

       */

       string SelectData(char * SQL,int Cnum ,char * Msg);

       /*

       主要功能:

       插入資料

       入口引數

       SQL:查詢的SQL語句

       Msg:返回的訊息,包括錯誤訊息

       出口引數:

       int :0表示成功;1表示失敗

       */

       int InsertData(char * SQL,char * Msg);

       /*

       主要功能:

       修改資料

       入口引數

       SQL:查詢的SQL語句

       Msg:返回的訊息,包括錯誤訊息

       出口引數:

       int :0表示成功;1表示失敗

       */

       int UpdateData(char * SQL,char * Msg);

       /*

       主要功能:

       刪除資料

       入口引數

       SQL:查詢的SQL語句

       Msg:返回的訊息,包括錯誤訊息

       出口引數:

       int :0表示成功;1表示失敗

       */

       int DeleteData(char * SQL,char * Msg);

       /*

       主要功能:

       關閉資料庫連線

       */

       void CloseMySQLConn();

};

第二個檔案實現檔案:VspdCTOMySQL.cpp

/****************************MYSQL IN C*******************************/

/*************************2007 -03 -07 *******************************/

/*************************李克喜**************************************/

#include "stdafx.h"

#include "VspdCTOMySQL.h"

VspdCToMySQL::VspdCToMySQL()

{

}

VspdCToMySQL::~VspdCToMySQL()

{

}

//初始化資料

int VspdCToMySQL::ConnMySQL(char *host,char * port ,char * Db,char * user,char* passwd,char * charset,char * Msg)

{

       if( mysql_init(&mysql) == NULL )

       {

              Msg = "inital mysql handle error";

              return 1;

       }    

       if (mysql_real_connect(&mysql,host,user,passwd,Db,0,NULL,0) == NULL)

       {

              Msg = "Failed to connect to database: Error";

              return 1;

       }    

       if(mysql_set_character_set(&mysql,"GBK") != 0)

       {

              Msg = "mysql_set_character_set Error";

              return 1;

       }

       return 0;

}

//查詢資料

string VspdCToMySQL::SelectData(char * SQL,int Cnum,char * Msg)

{

       MYSQL_ROW m_row;

    MYSQL_RES *m_res;

    char sql[2048];

    sprintf(sql,SQL);

       int rnum = 0;

       char rg = 0x06;//行隔開

       char cg = {0x05};//欄位隔開

       if(mysql_query(&mysql,sql) != 0)

       {

              Msg = "select ps_info Error";

              return "";

       }

       m_res = mysql_store_result(&mysql);

       if(m_res==NULL)

       {

              Msg = "select username Error";

              return "";

       }

       string str("");

       while(m_row = mysql_fetch_row(m_res))

       {

              for(int i = 0;i < Cnum;i++)

              {

                     str += m_row[i];

                     str += rg;

              }

              str += rg;             

              rnum++;

       }

       mysql_free_result(m_res);

       return str;

}

//插入資料

int VspdCToMySQL::InsertData(char * SQL,char * Msg)

{

       char sql[2048];

    sprintf(sql,SQL);

       if(mysql_query(&mysql,sql) != 0)

       {

              Msg = "Insert Data Error";

              return 1;

       }

       return 0;

}

//更新資料

int VspdCToMySQL::UpdateData(char * SQL,char * Msg)

{

       char sql[2048];

    sprintf(sql,SQL);

       if(mysql_query(&mysql,sql) != 0)

       {

              Msg = "Update Data Error";

              return 1;

       }

       return 0;

}

//刪除資料

int VspdCToMySQL::DeleteData(char * SQL,char * Msg)

{

       char sql[2048];

    sprintf(sql,SQL);

       if(mysql_query(&mysql,sql) != 0)

       {

              Msg = "Delete Data error";

              return 1;

       }

       return 0;

}

//關閉資料庫連線

void VspdCToMySQL::CloseMySQLConn()

{

       mysql_close(&mysql);

}

6、 在main函式,(如果是其他工程級不是main了,可能是一個按鈕裡面的程式碼塊)新增      一些程式碼,新增之後如下:

#include "stdafx.h"

#include "VspdCTOMySQL.h"

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

{

    char* host="MYSQL伺服器IP";

    char* user="root";

    char* port ="3306";

    char* passwd="使用者密碼";

    char* dbname="資料庫名稱"; 

    char* charset = "GBK";//支援中文

    char* Msg = "";//訊息變數

    //初始化

    VspdCToMySQL * vspdctomysql = new VspdCToMySQL;

    if(vspdctomysql->ConnMySQL(host,port,dbname,user,passwd,charset,Msg) == 0)

           printf("連線成功/r/n");

    else

           printf(Msg);

    //查詢

    char * SQL = "SELECT ids,username,passwd,address FROM vcaccesstest";

    string str = vspdctomysql->SelectData(SQL,4,Msg);

    if( str.length() > 0 )

    {

           printf("查詢成功/r/n");

           printf(str.data());

           printf("/r/n");

    }

    else

    {

           printf(Msg);

    }

    //插入

    SQL = "insert into vcaccesstest(ids,username,passwd,address) values(4,'我的','123210','測試地址')";

    if(vspdctomysql->InsertData(SQL,Msg) == 0)

           printf("插入成功/r/n");

    //更新

    SQL = "update vcaccesstest set username = '修改了',passwd='2345' where ids = 3 ";

    if(vspdctomysql->UpdateData(SQL,Msg) == 0)

           printf("更新成功/r/n");

    //刪除

    SQL = "delete from vcaccesstest where ids = 3 ";

    if(vspdctomysql->DeleteData(SQL,Msg) == 0)

           printf("刪除成功/r/n");

    vspdctomysql->CloseMySQLConn();

    return 0;

}

 7、 資料庫表確認表存在,(程式中的表和欄位是我的資料庫裡面的內容,你要自己搞定你的SQL語句了,你可以看main函式裡面的SQL變數的內容。

8、 編譯,執行,一切ok。

9、 總結,你要做的事情很少了,兩個主要的檔案寫好了,你看例子呼叫即可,其他MySQL的庫檔案和附加檔案別人也為您準備好了,移植到其他系統也是很簡單的,比如移植到Linux和Unix下也是很簡單的,VspdCTOMySQL.h和VspdCTOMySQL.cpp基本上是採用標準的C++編寫的,在別的系統可能需要做少量修改即可。