轉載:HTTP://blog.csdn.net/jemlee2002/archive/2007/03/07/1523164.aspx

看過很多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++編寫的,在別的系統可能需要做少量修改即可。
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()