1. 程式人生 > >MySQL資料庫使用——MySQL在C/C++的API介面

MySQL資料庫使用——MySQL在C/C++的API介面

直接操作MySQL,輸入命令效率低,將MySQL嵌入程式中,封裝介面,讓程式去訪問MySQL,才能最大效益利用MySQL。

MySQL C API移植

包含MySQL的工程檔案不應直接關聯電腦已安裝的MySQL,因為不同電腦伺服器安裝的位置不一樣,每次移植都需要重新部署安裝環境。應該將MySQL的標頭檔案以及操作的庫檔案一併拷貝到工程檔案中,這樣即使移植到別的安裝有MySQL電腦或伺服器,就不需要重新定位標頭檔案以及相關的庫檔案,直接操作訪問資料庫。除非隨著MySQL的版本升級導致介面引數改變,否則就可以直接利用。
移植之後即使裝置沒裝MySQL也可以編譯程式碼,只是沒有MySQL不能執行而已,工程不因裝置未MySQL而不能編譯通過。

移植MySQL標頭檔案

在linux中構建的Makefile工程要安裝libmysqlclient-dev才能使用API介面的標頭檔案。
命令:sudo apt-get install libmysqlclient-dev

安裝好後的標頭檔案在:/usr/include/mysql

[email protected]:/usr/include$ ls mysql/
big_endian.h                my_global.h             plugin_audit.h
binary_log_types.h          my_list.h               plugin_auth_common.h
byte_order_generic.h mysql plugin_ftparser.h byte_order_generic_x86.h mysql_com.h plugin_group_replication.h decimal.h mysql_com_server.h plugin.h errmsg.h mysqld_ername.h plugin_keyring.h keycache.h mysqld_error.h
plugin_validate_password.h little_endian.h mysql_embed.h psi m_ctype.h mysql.h sql_common.h m_string.h mysql_time.h sql_state.h my_alloc.h mysql_version.h sslopt-case.h my_byteorder.h mysqlx_ername.h sslopt-longopts.h my_command.h mysqlx_error.h sslopt-vars.h my_compiler.h mysqlx_version.h thr_cond.h my_config.h my_sys.h thr_mutex.h my_dbug.h my_thread.h thr_rwlock.h my_dir.h my_thread_local.h typelib.h my_getopt.h my_xml.h

Windows的MySQL標頭檔案即在安裝目錄裡面。

MySQL標頭檔案:C:\Program Files\MySQL\MySQL Server 5.7\include\
C++操作標頭檔案:C:\Program Files\MySQL\Connector.C++ 1.1

windows和linux的標頭檔案結構略有差異,但大體都是相等的,此次移植是linux的MySQL標頭檔案。
不推薦使用C++操作標頭檔案,因為需要用到boost庫,boost庫安裝編譯繁瑣。

將標頭檔案全部複製到工程標頭檔案中。
命令:test_makefile/inc$ cp /usr/include/mysql/ ./ -rf

複製之後的工程標頭檔案目錄如下圖所示
這裡寫圖片描述

Makefile工程:

將標頭檔案加入到Makefile中,編輯Makefile。

NC += -I$(DIR)/inc/mysql

Visual Studio工程

引用標頭檔案如下圖所示
這裡寫圖片描述

移植MySQL庫檔案

Makefile工程

由於Makefile工程移植的庫檔案為.so或.a的庫檔案,因此一定要移植Linux下的MySQL庫檔案。

同標頭檔案一樣,linux要安裝libmysqlclient-dev才能使用API介面的標頭檔案。
命令:

sudo apt-get install libmysqlclient-dev

安裝好後的庫檔案在:/usr/lib/mysql和/usr/lib下

Visual Studio工程

與Linux不同的是,Visual Studio工程移植的庫檔案為.lib或.dll的庫檔案。
庫檔案位置:

C:\Program Files\MySQL\MySQL Server 5.7\lib

檔案位置即MySQL安裝位置。
如下圖所示
這裡寫圖片描述

將庫檔案全部拷貝到工程庫檔案目錄下

├── open_lib
│   ├── MySQL_lib
│   │   ├── libmysql.dll
│   │   ├── libmysql.lib
│   │   └── mysqlclient.lib

專案引用庫檔案,如下圖所示
這裡寫圖片描述

這裡寫圖片描述

新增工程執行環境dll。為保證程式執行後不需要依賴系統的環境變數,需要將dll放到編譯器的輸出資料夾中,如定義了obj為輸出資料夾,就dll放到該資料夾中。如下圖所示。
這裡寫圖片描述

新增MySQL示例

工程新增MySQL示例測試MySQL移植工程。
module_MySQL.cpp

#include "module_MySQL.h"
#include <iostream>
#include <string>
#include <mysql/mysql.h>

using namespace std;

void TestMySQL(void)
{
    cout << __FUNCTION__ << " is called." << endl;

    MYSQL mysql;
    mysql_init(&mysql);
    mysql_real_connect(&mysql, "localhost", "zxpro-admin", "qwerty", "zx_mysql", 3306, NULL, 0);

    //MySQL命令
    string sql = "select * from zx_users;";
    mysql_query(&mysql, sql.c_str());

    try
    {
        MYSQL_RES *result = mysql_store_result(&mysql);
        if (!result)
            throw string("MySQL not result!");

        //獲取欄位數量
        int num_fields = mysql_num_fields(result);
        if(0 == num_fields)
            throw string("MySQL fields number is 0!");

        //獲取欄位名
        MYSQL_FIELD *fields = mysql_fetch_fields(result);
        if (!fields)
            throw string("MySQL fields fetch is error!");

        for (int i = 0; i < num_fields; i++)
        {
            cout << "field " << i << " name is " << fields[i].name << endl;
        }

        cout << "MySQL is OK." << endl;
    }
    catch (string &error_msg)
    {
        cout << error_msg << endl;
    }
    catch (...)
    {
        cout << "MySQL operation is error!" << endl;
    }

    mysql_close(&mysql);
}

資料庫結構下圖所示。
這裡寫圖片描述

示例工程執行結果如下圖所示。
這裡寫圖片描述

MySQL C API

標頭檔案包含

要使用MySQL的介面API,需要包含標頭檔案

#include <mysql/mysql.h>

登入MySQL:mysql_init(),mysql_real_connect()

函式原型:

MYSQL * STDCALL mysql_init(MYSQL *mysql);
//成功返回*mysql指標,失敗返回NULL。

MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, 
                                const char *host,   //MySQL的IP,遠端登入輸入遠端登入的IP地址
                                const char *user,   //登入使用者
                                const char *passwd, //登入密碼
                                const char *db,     //使用的資料庫名稱
                                unsigned int port,  //MySQL埠
                                const char *unix_socket,    //是否使用socket機制登入,NULL:否
                                unsigned long clientflag);  //連線標誌,通常為0

//成功返回*mysql指標,失敗返回NULL。

clientflag連線標誌在檔案:mysql_com.h 以#define CLIENT_*定義
以下擷取片段:

#define CLIENT_LONG_PASSWORD        1           /* new more secure passwords */
#define CLIENT_FOUND_ROWS           2           /* Found instead of affected rows */
#define CLIENT_LONG_FLAG            4           /* Get all column flags */
#define CLIENT_CONNECT_WITH_DB      8           /* One can specify db on connect */
#define CLIENT_NO_SCHEMA            16          /* Don't allow database.table.column */
#define CLIENT_COMPRESS             32          /* Can use compression protocol */
#define CLIENT_ODBC                 64          /* Odbc client */
#define CLIENT_LOCAL_FILES          128         /* Can use LOAD DATA LOCAL */
#define CLIENT_IGNORE_SPACE         256         /* Ignore spaces before '(' */
#define CLIENT_PROTOCOL_41          512         /* New 4.1 protocol */
#define CLIENT_INTERACTIVE          1024        /* This is an interactive client */
#define CLIENT_SSL                  2048        /* Switch to SSL after handshake */
#define CLIENT_IGNORE_SIGPIPE       4096        /* IGNORE sigpipes */
#define CLIENT_TRANSACTIONS         8192        /* Client knows about transactions */
#define CLIENT_RESERVED             16384       /* Old flag for 4.1 protocol  */
#define CLIENT_RESERVED2            32768       /* Old flag for 4.1 authentication */

示例:登入MySQL資料庫

    try
    {
        if (!mysql_init(&mysql))
            throw string("MySQL init is error!");

        if (!mysql_real_connect(&mysql, "localhost", "zxpro-admin", "qwerty", "zx_mysql", 3306, NULL, 0))
            throw string("MySQL connect is error!");

    catch (string &error_msg)
    {
        cout << error_msg << endl;
    }
    catch (...)
    {
        cout << "MySQL operation is error!" << endl;
    }

    mysql_close(&mysql);

操作MySQL:mysql_query()

函式原型:

int STDCALL mysql_query(MYSQL *mysql,   //MySQL操作結構體
                        const char *q); //操作命令

//成功返回0,失敗返回1

失敗時呼叫mysql_error(),返回值為具體失敗的描述

示例:操作MySQL資料庫

    try
    {
        …………………

        string sql = "SELECT * from zx_users;";
        if (mysql_query(&mysql, sql.c_str()))
        {   
            string err_string = mysql_error(&mysql);

            if(err_string.empty())
                throw string("MySQL query is error!");
            else
                throw err_string;
        }
        ………………
    }
    catch (string &error_msg)
    {
        cout << error_msg << endl;
    }
    catch (...)
    {
        cout << "MySQL operation is error!" << endl;
    }

    mysql_close(&mysql);

命令錯誤時的列印如下圖所示:
這裡寫圖片描述

關閉MySQL:mysql_close()

函式原型:

void STDCALL mysql_close(MYSQL *sock);

示例:關閉MySQL資料庫

mysql_close(&mysql);

讀取MySQL資料:mysql_store_result ()

獲取命令結果函式 :mysql_store_result()
讀取欄位函式 :mysql_fetch_fields()
讀取欄位數量函式 :mysql_num_fields()
讀取資料函式 :mysql_fetch_row()
釋放結果函式 :mysql_free_result(result);

函式原型

MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);
MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res);

typedef char **MYSQL_ROW;       /* return data as array of strings */
MYSQL_ROW   STDCALL mysql_fetch_row(MYSQL_RES *result);
void STDCALL mysql_free_result(MYSQL_RES *result);

mysql_fetch_fields返回的是欄位型別,包括欄位名,欄位長度等欄位屬性
MYSQL_FIELD結構體定義:mysql.h

typedef struct st_mysql_field {
  char *name;                   /* Name of column */

    ………………………….
} MYSQL_FIELD;

讀取具體資料重點:

mysql_fetch_row返回的是一個char型的雙指標,指向對應欄位數量的陣列。數組裡面的資料資料以string的形式展現,若欄位為空,內容為NULL。讀完一組欄位後再呼叫則指向下一個欄位,到底則返回NULL。

測試程式

    try
    {       
………………………………….

//MySQL命令
        string sql = "SELECT * from zx_users;";
        if (mysql_query(&mysql, sql.c_str()))
        {   
            string err_string = mysql_error(&mysql);

            if(err_string.empty())
                throw string("MySQL query is error!");
            else
                throw err_string;
        }
        cout << "MySQL : " << sql << endl;

        MYSQL_RES *result = mysql_store_result(&mysql);
        if (!result)
            throw string("MySQL not result!");
        //獲取欄位數量
        int num_fields = mysql_num_fields(result);
        if(0 == num_fields)
            throw string("MySQL fields number is 0!");
        //獲取欄位名
        MYSQL_FIELD *fields = mysql_fetch_fields(result);
        if (!fields)
            throw string("MySQL fields fetch is error!");

        for (int i = 0; i < num_fields; i++)
        {
            cout << " " << fields[i].name;
        }
        cout << endl;

        while (MYSQL_ROW row = mysql_fetch_row(result)) //獲取整條資料內容
        {
            for (int i = 0; i < num_fields; i++)
            {
                if (NULL == row[i])
                {
                    cout << " NULL";
                }
                else
                {
                    cout << " " << row[i];
                }   
            }
            cout << endl;
        }

        mysql_free_result(result);

        cout << "MySQL is OK." << endl;
    }
    catch (string &error_msg)
    {
        cout << error_msg << endl;
    }
    catch (...)
    {
        cout << "MySQL operation is error!" << endl;
    }

資料庫資料如下圖所示
這裡寫圖片描述

函式API讀取資料執行結果如下圖所示。
這裡寫圖片描述

讀取過濾的MySQL命令:SELECT phone from zx_users where vname = ‘user2’;

讀取結果如下圖所示。
這裡寫圖片描述

MySQL C++ API移植

之所以將C++的API與C分分離,因為C++可以用C的API,但C++可以將操作封裝到類裡面,但需要安裝boost庫支援。需要重新配置C++的標頭檔案和庫檔案。

使用條件:
這裡寫圖片描述

Windows在安裝MySQL的時候已經安裝了相應的庫和標頭檔案。
Linux安裝時沒有包含,需要到MySQL官網下載相應的庫和標頭檔案。
官網下載地址:
https://dev.mysql.com/downloads/connector/cpp/

如下圖所示。
這裡寫圖片描述

移植MySQL C++標頭檔案

要使用C++類封裝的API,必須重新移植其標頭檔案和庫檔案,移植後可以不用C API的標頭檔案。

Makefile工程

解壓下載好的檔案,解壓後工程如下所示

~/Tools/mysql_connector_cpp$ tree
.
├── COPYING
├── include
│   ├── cppconn
│   │   ├── build_config.h
│   │   ├── config.h
│   │   ├── connection.h
│   │   ├── datatype.h
│   │   ├── driver.h
│   │   ├── exception.h
│   │   ├── metadata.h
│   │   ├── parameter_metadata.h
│   │   ├── prepared_statement.h
│   │   ├── resultset.h
│   │   ├── resultset_metadata.h
│   │   ├── sqlstring.h
│   │   ├── statement.h
│   │   ├── variant.h
│   │   ├── version_info.h
│   │   └── warning.h
│   ├── mysql_connection.h
│   ├── mysql_driver.h
│   └── mysql_error.h
├── lib
│   ├── libmysqlcppconn.so -> libmysqlcppconn.so.7
│   ├── libmysqlcppconn.so.7 -> libmysqlcppconn.so.7.1.1.9
│   ├── libmysqlcppconn.so.7.1.1.9
│   └── libmysqlcppconn-static.a
├── Licenses_for_Third-Party_Components.txt
└── README

3 directories, 26 files
~/Tools/mysql_connector_cpp$

將標頭檔案拷貝到工程的標頭檔案inc中

~/inc/Connector.C++ 1.1$ tree
.
├── COPYING.txt
├── include
│   ├── cppconn
│   │   ├── build_config.h
│   │   ├── config.h
│   │   ├── connection.h
│   │   ├── datatype.h
│   │   ├── driver.h
│   │   ├── exception.h
│   │   ├── metadata.h
│   │   ├── parameter_metadata.h
│   │   ├── prepared_statement.h
│   │   ├── resultset.h
│   │   ├── resultset_metadata.h
│   │   ├── sqlstring.h
│   │   ├── statement.h
│   │   ├── variant.h
│   │   ├── version_info.h
│   │   └── warning.h
│   ├── mysql_connection.h
│   ├── mysql_driver.h
│   └── mysql_error.h
├── Licenses_for_Third-Party_Components.txt
└── README.txt

2 directories, 22 files
~/inc/Connector.C++ 1.1$

將標頭檔案新增到Makefile工程中,編輯Makefile

INC += -I$(DIR)/mysql_connector_cpp/include

Visual Studio工程

Windows在安裝MySQLd的時候已經安裝了相應的庫和標頭檔案。
C++操作標頭檔案:

C:\Program Files\MySQL\Connector.C++ 1.1

檔案結構如下所示

~/Connector.C++ 1.1$ tree
.
├── COPYING.txt
├── include
│   ├── cppconn
│   │   ├── build_config.h
│   │   ├── config.h
│   │   ├── connection.h
│   │   ├── datatype.h
│   │   ├── driver.h
│   │   ├── exception.h
│   │   ├── metadata.h
│   │   ├── parameter_metadata.h
│   │   ├── prepared_statement.h
│   │   ├── resultset.h
│   │   ├── resultset_metadata.h
│   │   ├── sqlstring.h
│   │   ├── statement.h
│   │   ├── variant.h
│   │   ├── version_info.h
│   │   └── warning.h
│   ├── mysql_connection.h
│   ├── mysql_driver.h
│   └── mysql_error.h
├── lib
│   └── opt
│       ├── mysqlcppconn.dll
│       ├── mysqlcppconn.lib
│       └── mysqlcppconn-static.lib
├── Licenses_for_Third-Party_Components.txt
└── README.txt

4 directories, 25 files
~/Connector.C++ 1.1$

引用標頭檔案如下圖所示
這裡寫圖片描述

移植MySQL C++庫檔案

Makefile工程

將庫檔案拷貝到工程的庫目錄中

~/open_lib$ tree
.
├── gtest.a
├── libmysqlclient.so
└── MySQL_lib
    ├── libmysqlcppconn.so
    ├── libmysqlcppconn.so.7
    ├── libmysqlcppconn.so.7.1.1.9
    ├── libmysqlcppconn-static.a
    ├── libmysql.dll
    ├── libmysql.lib
    ├── mysqlclient.lib
    ├── mysqlcppconn.dll
    ├── mysqlcppconn.lib
    └── mysqlcppconn-static.lib

1 directory, 12 files
~/open_lib$

庫檔案編譯新增到Makefile工程中,編輯Makefile

MYSQL_LIB += -L$(DIR)/open_lib/MySQL_lib -lmysqlcppconn

Visual Studio工程

庫檔案位置:C:\Program Files\MySQL\Connector.C++ 1.1\lib\opt
檔案位置即MySQL安裝位置。
如下圖所示
這裡寫圖片描述

將庫檔案全部拷貝到工程庫檔案目錄下

├── open_lib
│   ├── MySQL_lib
│   │   ├── libmysql.dll
│   │   ├── libmysql.lib
│   │   ├── mysqlclient.lib
│   │   ├── mysqlcppconn.dll
│   │   ├── mysqlcppconn.lib
│   │   └── mysqlcppconn-static.lib

專案引用庫檔案,如下圖所示
這裡寫圖片描述

這裡寫圖片描述

新增工程執行環境dll。為保證程式執行後不需要依賴系統的環境變數,需要將dll放到編譯器的輸出資料夾中,如定義了obj為輸出資料夾,就dll放到該資料夾中。如下圖所示。
這裡寫圖片描述

引用boost庫

MySQL的C++操作函式需要boost庫的支援,因此將編譯好的boost庫標頭檔案位置以及庫路徑新增進工程中。

引用boost庫標頭檔案和庫檔案:
因為boost庫比較大一般引用的是電腦的路徑,為了與可移植的工程配置分開,將boost庫標頭檔案和庫檔案在工程配置的VC++目錄中,如下圖所示。
這裡寫圖片描述

新增完畢之後不需要在聯結器上新增庫檔案。

Linux的由於boost庫新增進系統變數中,編譯時直接呼叫標頭檔案即可。
沒有新增的需要編輯/etc/profile檔案

export BOOST_INCLUDE=/home/ghost/Tools/boost_1_60_0:$CPLUS_INCLUDE_PATH
export BOOST_LIBRARY=/home/ghost/Tools/boost_1_60_0/stage/lib:$LIBRARY_PATH
export BOOST_LD_LIBRARY=/home/ghost/Tools/boost_1_60_0/stage/lib:$LD_LIBRARY_PATH

新增MySQL示例

工程新增MySQL示例測試MySQL移植工程。
module_MySQLcpp.cpp

#include "module_MySQLcpp.h"
#include <iostream>
#include <string>
#include <vector>

#include <mysql_driver.h>
#include <mysql_connection.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
#include <cppconn/driver.h>
#include <cppconn/metadata.h>
#include <cppconn/exception.h>

using namespace std;
using namespace sql;

void TestCppSQL(void)
{

    std::string sql = " SELECT * from zx_users where vname = 'user2';";
    try
    {
        sql::mysql::MySQL_Driver *pMysqldriver = mysql::get_mysql_driver_instance();
        if (NULL == pMysqldriver)
            throw string("MySQL get_mysql_driver_instance is Error.");

        sql::Connection *pMysqlconnection = pMysqldriver->connect("localhost",
                                                                    "zxpro-admin", 
                                                                    "qwerty");
        if (NULL == pMysqlconnection)
            throw string("MySQL connect is Error.");

        Statement *pMysqlstat = pMysqlconnection->createStatement();
        if (NULL == pMysqlstat)
            throw string("MySQL createStatement is Error.");

        if(pMysqlstat->execute("use zx_mysql;"))
            throw string("MySQL execute is Error.");

        sql::ResultSet *result = pMysqlstat->executeQuery(sql.c_str());
        if(NULL == result)
            throw string("MySQL executeQuery is Error.");
        while (result->next())
        {
            cout << "-----------------" << endl;
            cout << "vname is       : " << result->getString("vname").c_str() << endl;
            cout << "vpwd is        : " << result->getString("vpwd").c_str() << endl;
            string pwdtype = result->getString("pwdtype").c_str();
            cout << "pwdtype is     : " << (pwdtype.empty() ? "NULL" : pwdtype) << endl;
            string phone = result->getString("phone").c_str();
            cout << "phone is       : " << (phone.empty() ? "NULL" : phone) << endl;
            cout << "add_time is    : " << result->getString("add_time").c_str() << endl;
            cout << endl;
        }

        cout << "MySQL is OK." << endl;

        delete result;
        result = NULL;

        delete pMysqlstat;
        pMysqlstat = NULL;

        pMysqlconnection->close();
        delete pMysqlconnection;
        pMysqlconnection = NULL;
    }
    catch (const SQLException &CMysqlErr)
    {
        cout << "SQL what       :" << CMysqlErr.what() << endl;
        cout << "SQL Error code :" << CMysqlErr.getErrorCode() << endl;
        cout << "SQL State          :" << CMysqlErr.getSQLStateCStr() << endl;
    }
    catch (const std::string &Err_Msg)
    {
        cout << Err_Msg << endl;
    }
    catch (const std::exception &Err)
    {
        cout << "exception  what :"<< Err.what() << endl;
    }
    catch (...)
    {
        cout << "MySQL operation is error!" << endl;
    }
}

示例工程執行結果如下圖所示。
這裡寫圖片描述

MySQL C++ API

標頭檔案包含

要使用MySQL的介面API,需要包含標頭檔案

#include <mysql_driver.h>
#include <mysql_connection.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>
#include <cppconn/driver.h>
#include <cppconn/metadata.h>
#include <cppconn/exception.h>

//使用MySQL名稱空間
using namespace sql;

MySQL異常類:SQLException

類的說明

class CPPCONN_PUBLIC_FUNC SQLException : public std::runtime_error

類的介面呼叫

    catch (SQLException &CMysqlErr)
    {
        cout << "SQL what           :" << CMysqlErr.what() << endl;
        cout << "SQL Error code :" << CMysqlErr.getErrorCode() << endl;
        cout << "SQL State          :" << CMysqlErr.getSQLStateCStr() << endl;
    }

類的列印,如輸入錯誤SQL命令,MySQL函式拋異常,捕獲到的異常列印資訊為
錯誤MySQL指令:std::string sql = “SELECC * from zx_users;”;

CSystem is called.
SQL what       :You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECC * from zx_users' at line 1
SQL Error code :1064
SQL State      :42000

登入MySQL:mysql::get_mysql_driver_instance()

函式原型:

CPPCONN_PUBLIC_FUNC MySQL_Driver * get_driver_instance();
static inline MySQL_Driver * get_mysql_driver_instance() { return get_driver_instance(); }

動態庫函式定義

#if defined(_WIN32)
 // mysqlcppconn_EXPORTS is added by cmake and defined for dynamic lib build only
  #ifdef mysqlcppconn_EXPORTS
    #define CPPCONN_PUBLIC_FUNC __declspec(dllexport)
  #else
    // this is for static build
    #ifdef CPPCONN_LIB_BUILD
      #define CPPCONN_PUBLIC_FUNC
    #else
      // this is for clients using dynamic lib
      #define CPPCONN_PUBLIC_FUNC __declspec(dllimport)
    #endif
  #endif
#else
  #define CPPCONN_PUBLIC_FUNC
#endif

MySQL驅動操作類:

class CPPCONN_PUBLIC_FUNC MySQL_Driver : public sql::Driver
{
    boost::scoped_ptr< ::sql::mysql::NativeAPI::NativeDriverWrapper > proxy;

public:
    MySQL_Driver();
    MySQL_Driver(const ::sql::SQLString & clientLib);

    virtual ~MySQL_Driver();

        sql::Connection * connect(const sql::SQLString& hostName, //MySQL的IP,遠端登入輸入遠端登入的IP地址
                                const sql::SQLString& userName,   //登入使用者
                                const sql::SQLString& password);  //登入密碼

    sql::Connection * connect(sql::ConnectOptionsMap & options);

    int getMajorVersion();

    int getMinorVersion();

    int getPatchVersion();

    const sql::SQLString & getName();

    void threadInit();

    void threadEnd();

private:
    /* Prevent use of these */
    MySQL_Driver(const MySQL_Driver &);
    void operator=(MySQL_Driver &);
};

C++操作函式登入MySQL的步驟

    sql::mysql::MySQL_Driver *pMysqldriver = mysql::get_mysql_driver_instance();
    if (nullptr == pMysqldriver)
            throw string("MySQL_Driver is error");

    sql::Connection *pMysqlconnection = pMysqldriver->connect("localhost", 
                                                                "zxpro-admin", 
                                                                "qwerty");

//指定埠用此登入
sql::Connection *pMysqlconnection = pMysqldriver->connect("tcp://localhost:3306", //指定埠
                                                            "zxpro-admin", 
                                                            "qwerty");

    if (nullptr == pMysqlconnection)
        throw string("MySQL Connection is error!");

操作MySQL:execute(),executeQuery(),executeUpdate()

使用前通過連線得到的指標先呼叫建立語句函式:createStatement()

        Statement *pMysqlstat = pMysqlconnection->createStatement();
        pMysqlstat->execute("use zx_mysql;");       
        sql::ResultSet *result = pMysqlstat->executeQuery(sql.c_str());

函式原型

virtual Statement *createStatement() = 0;
virtual bool execute(const sql::SQLString& sql) = 0;
virtual ResultSet * executeQuery(const sql::SQLString& sql) = 0;
virtual int executeUpdate(const sql::SQLString& sql) = 0;

重點:
sql::SQLString不能接收std::string直傳,需要呼叫c_str()轉成C字串的形式傳。

三個函式都是可以執行操作MySQL,從返回值可以看出其功能。

bool execute()              :返回的是語句的操作成功與失敗。
ResultSet * executeQuery()  :返回類指標ResultSet,說明需要獲得MySQL語句查詢的結果
int executeUpdate           :返回整型,說明返回被更新的個數

可以根據語句的需要呼叫不同的執行函式:

mysql> select vname, phone from zx_users where pwdtype = 'MD5';
+-----------+-----------+
| vname     | phone     |
+-----------+-----------+
| user1     | 123456    |
| userpwd   | NULL      |
+-----------+-----------+
2 rows in set

mysql> update zx_users set phone = 321654 where pwdtype = 'MD5';
Query OK, 2 rows affected
Rows matched: 2  Changed: 2  Warnings: 0

mysql> use zx_mysql;
Database changed

關閉MySQL:close()

呼叫類sql::Connection的關閉函式close()來關閉MySQL的連線。
pMysqlconnection->close();

讀取MySQL資料:executeQuery()

呼叫該函式後,會獲得資料結果類ResultSet的指標。
ResultSet類定義標頭檔案:Connector.C++ 1.1\include\cppconn\resultset.h

結果通過字串描述的欄位獲取MySQL欄位中的資料內容,前提是需要知道該欄位的資料型別,檢視欄位型別命令:DESC
這裡寫圖片描述

其中Type即欄位的型別。

    cout << "vname is       : " << result->getString("vname").c_str() << endl;
    string phone = result->getString("phone").c_str();
    cout << "phone is       : " << (phone.empty() ? "NULL" : phone) << endl;

ResultSet類讀取資料函式原型

    //獲取字元型資料
    virtual SQLString getString(const sql::SQLString& columnLabel) const = 0;

    //獲取int型資料
    virtual int32_t     getInt(const sql::SQLString& columnLabel) const = 0;
    virtual uint32_t    getUInt(const sql::SQLString& columnLabel) const = 0;
    virtual int64_t     getInt64(const sql::SQLString& columnLabel) const = 0;
    virtual uint64_t    getUInt64(const sql::SQLString& columnLabel) const = 0;

    //獲取二進位制資料
    virtual std::istream * getBlob(const sql::SQLString& columnLabel) const = 0;

欄位描述字元串同樣不能直接傳string,需要呼叫c_str()轉成C字串的形式傳。

測試程式

    std::string sql = "SELECT * from zx_users;";

    try
    {
        ………

        sql::ResultSet *result = pMysqlstat->executeQuery(sql.c_str());
        if(NULL == result)
            throw string("MySQL executeQuery is Error.");

        while (result->next())
        {
            cout << 
            
           

相關推薦

C++連線MySQL資料庫(利用API

一般C/C++與資料庫相連有兩種方法。 利用ODBC,ADO,或者JDBC 用ODBC,ADO,JDBC等這些介面,利用裡面的方法來進行與資料庫的連線,簡化對資料庫的操作,方便對資料庫進行管理。 介面的區別可以參考以下文章 不過注意的是C/C++

分享幾本比較好的pdf書籍,包括oracle資料庫mysql資料庫C語言程式設計,java程式設計,以及linux作業系統等

1.個人認為最好的oracle資料庫學習書籍,找了很久,發現內容最全講解最清晰《Oracle PL/SQL程式設計》上下 連結:https://pan.baidu.com/s/1VxvbW070_-KEFKEwY0iFCg  提取碼:rm1e  2.《linux系統程式設計

10款最好用的MySQL資料庫客戶端圖形介面管理工具

 MySQL 在過去由於效能高、成本低、可靠性好,已經成為最流行的開源資料庫,因此被廣泛地應用在 Internet 上的中小型網站中。隨著 MySQL 的不斷成熟,它也逐漸用於更多大規模網站和應用,比如維基百科、Google 和 Facebook 等網站。非常流行的開源軟

sqlite的C/C++ API介面的基礎操作與事務

一、C/C++ 介面 API 主要通過通過sqlite3_open,sqlite3_exec和qlite3_close來實現一個簡單的資料庫操作。 1.1、sqlite3_open sqlite3_open(const char *filename, sqlit

sqlite之我見--C/C++ API介面示例 .

在之前的兩篇博文中,分別介紹了SQLITE的基礎知識和操作,C/C++ 的一些常用API 本文中,我會給大家用幾個小程式示例SQLITE C/C++ API的使用。 1.我們看下最簡單的sqlite程式,通過sqlite3_open, sqlite3_exec, sq

MySQL資料庫使用——MySQLC/C++的API介面

直接操作MySQL,輸入命令效率低,將MySQL嵌入程式中,封裝介面,讓程式去訪問MySQL,才能最大效益利用MySQL。 MySQL C API移植 包含MySQL的工程檔案不應直接關聯電腦已安裝的MySQL,因為不同電腦伺服器安裝的位置不一樣,每次

C++ API方式連線mysql資料庫實現增刪改查

轉自 http://www.bitscn.com/pdb/mysql/201407/226252.html 一、環境配置 1,裝好mysql,新建一個C++控制檯工程(從最簡單的弄起,這個會了,可以往任何c++工程移植),在vs2010中設定,工程--屬性--VC++目

採用C/S架構完成使用者註冊並連線Mysql資料庫介面winform)

語言:C#開發平臺:VS2017對於C/S架構的一些基本互動我前面已經寫過了,這裡就不再贅述,C#並沒有直接連線資料庫的東西,需要匯入資料庫的外掛才能驅動資料庫操作,using MySql.Data.MySqlClient;也就是引如這個名稱空間,這個空間來自Mysql下的一

MysqlC語言API介面在專案中的使用

#include "Mysql.h" int Mysql::select_user_store(char *sql,char *user_info) { int reta = mysql_real_query1(sql); if (

Python爬蟲-利用百度地圖API介面爬取資料並儲存至MySQL資料庫

首先,我這裡有一份相關城市以及該城市的公園數量的txt檔案: 其次,利用百度地圖API提供的介面爬取城市公園的相關資訊。 所利用的API介面有兩個: 1、http://api.map.baidu.com/place/v2/search?q=公園&

C# 實現 MySql資料庫連線 登入並跳轉介面

前言:連線上篇文章,在上文C#登入並跳轉介面基礎上,修改登入視窗使用者資訊的驗證方式,從簡單字串匹配判斷,改進到連線MySql資料庫進行驗證。正文:1.Mysql資料庫的建立2.Visual Studio 2017 的設定(2) 安裝好以後,找到它的安裝路徑,一般都是C:\P

C++連線mysql資料庫的兩種方法(ADO連線和mysql api連線)

【原文 http://www.jb51.net/article/44262.htm 】 現在正做一個介面,通過不同的連線字串操作不同的資料庫。要用到mysql資料庫,C++連線mysql有2種方法:利用ADO連線、利用mysql自己的api函式進行連線,下面看看如何用吧。

C API--linux上c語言讀取資料庫內容(mysql

這裡歸納了C API可使用的函式,詳見MYSQL手冊 函式 描述 mysql_affected_rows() 返回上次UPDATE、DELETE或INSERT查詢更改/刪除/插入的行數。 mysql_autocommit() 切換 autocommit模式,ON/OFF mysql

Json訪問Mysql資料庫返回json資料 (API介面

因為畢業設計的課題需要從服務端解析json資料,從而展示到安卓UI介面 所以我需要自學服務端的一些知識 在網上看了一些教程,結合自己的實際操作,做了以下一個demo以進行測試 第一步,準備資料庫 我首先準備好了一個excel 表 ,用於存放我們需要解析的

C api 連線mysql資料庫的 開發例項

1. 下載mysql c connector 安裝包; 有兩種方法:                  1 下載tar檔案, 將其中的的 lib, include , bin 都放在 /usr/local 相應的目錄下;                  2. 也可配置連

C#怎樣連結mysql資料庫

C#一般連結sqlserver資料庫,當然也會連結oracle。C#和MYSQL搭配貌似不多見哦 下面說說方法。 1、下載連結庫檔案,MySql.Data.dll MySql.Data.rar 2、工程引用檔案,並在類檔案中應用using using MySql.Data; using MySql.

c#Mysql資料庫

         /// <summary>         /// 建立mysql資料庫連結         /// </summary>

sqlite3- SQLite資料庫的DB-API 2.0介面

sqlite3- SQLite資料庫的DB-API 2.0介面 SQLite是一個C庫,它提供了一個基於磁碟的輕量級資料庫,它不需要單獨的伺服器程序,並允許使用SQL查詢語言的非標準變體訪問資料庫。某些應用程式可以使用SQLite進行內部資料儲存。也可以使用SQLite對應用程式進行原型

vs2013下c++連線mysql資料庫

 本文使用的是mysql提供的api來進行連線,這樣使用比較方便。 開發環境:mysql 5.6+vs2013+win8.1作業系統 步驟1: 要使用mysql的api,需要mysql安裝目錄下include 和 lib 兩個資料夾的東西,如果你用的是wamp或者php

Zookeeper C API介面描述

Zookeeper C API介面大部分以zoo_開頭,少量介面以zookeeper_開頭。 除了初始化/銷燬控制代碼、設定日誌等級/日誌流以及一些輔助功能的API外,Zookeeper C API介面分為同步介面和非同步介面:同步介面以zoo_開頭、非同步介面以zoo_a開頭。 1、初