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++編寫的,在別的系統可能需要做少量修改即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章