1. 程式人生 > >Linux C++操作mysql入門

Linux C++操作mysql入門

一、初識與mysql相關的部分資料型別和api

1.1)  MYSQL:該結構代表一個數據庫的連線控制代碼,一般我們都不去複製它

        MYSQL_RES:查詢返回的結果集

        MYSQL_ROW:一行資料的表示,通過呼叫mysql_fetch_row()獲得的

        MYSQL_FIELD:該結構包含欄位資訊,如欄位名、型別和大小等。欄位指不包含在這一結構中,其值位於MYSQL_ROW結構中。

1.2)  部分api

 1)

MYSQL *mysql_init(MYSQL *mysql)

描述

分配或初始化與mysql_real_connect()相適應的MYSQL物件。如果mysqlNULL指標,該函式將分配、初始化、並返回新物件。否則,將初始化物件,並返回物件的地址。如果mysql_init()分配了新的物件,當呼叫mysql_close()來關閉連線時。將釋放該物件。

返回值

初始化的MYSQL*控制代碼。如果無足夠記憶體以分配新的物件,返回NULL

2)

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)

描述

與執行在主機上的mysql資料庫建立連線。必須在mysql_init呼叫成功之後才可以呼叫該函式。

引數解析:

mysqlmysql_init成功返回的控制代碼

host:主機名或者ip地址,該引數為NULL或者"localhost"表示本機。

user:db使用者名稱

passwd:db密碼

db:要訪問的db名字,如果dbNULL連線會將預設的資料庫設為該值

port:若“port”不是0其值將用作TCP/IP連線的埠號。注意,“host”引數決定了連線的型別。

client_flag:通常為0

unix_socket: 可以取NULL,該字串描述了應使用的套接字或命名管道

3)

int mysql_query(MYSQL *mysql, const char *q)

描述

執行由“Null終結的字串”查詢指向的SQL查詢。正常情況下,字串必須包含1SQL語句,而且不應為語句新增終結分號(‘;’)或“\g”。如果允許多語句執行,字串可包含多條由分號隔開的語句,引數q為sql語句。返回值,0-成功,非0-失敗。

4)

int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

描述

執行由“query”指向的SQL查詢,它應是字串長度位元組“long”。對於包含二進位制資料的查詢,必須使用mysql_real_query()而不是mysql_query(),這是因為,二進位制資料可能會包含\0’字元。此外,mysql_real_query()mysql_query()快,這是因為它不會在查詢字串上呼叫strlen()

5)

MYSQL_RES *mysql_store_result(MYSQL *mysql)

描述

對於成功檢索了資料的每個查詢(SELECTSHOWDESCRIBEEXPLAINCHECK TABLE),呼叫mysql_store_result()獲取結果集,如果查詢未返回結果集或讀取失敗,mysql_store_result()將返回Null指標。

6)

my_ulonglong mysql_affected_rows(MYSQL *mysql)

描述

返回受影響的行數

7)

unsigned int mysql_field_count(MYSQL *mysql)

描述

返回作用在連線上的最近查詢的列數。

8)

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)

描述

對於結果集,返回所有MYSQL_FIELD結構的陣列。每個結構提供了結果集中1列的欄位定義。

返回值

關於結果集所有列的MYSQL_FIELD結構的陣列。

9)

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

描述

檢索結果集的下一行。在mysql_store_result()之後使用時,如果沒有要檢索的行,mysql_fetch_row()返回NULL

行內值的數目由mysql_num_fields(result)給出。如果行中儲存了呼叫mysql_fetch_row()返回的值,將按照row[0]row[mysql_num_fields(result)-1],訪問這些值的指標。行中的NULL值由NULL指標指明。

可以通過呼叫mysql_fetch_lengths()來獲得行中欄位值的長度。對於空欄位以及包含NULL的欄位,長度為0。通過檢查欄位值的指標,能夠區分它們。

返回值

下一行的MYSQL_ROW結構。如果沒有更多要檢索的行或出現了錯誤,返回NULL

10)

unsigned int mysql_num_fields(MYSQL_RES *result)

要想傳遞MYSQL*參量取而代之,請使用無符號整數mysql_field_count(MYSQL *mysql)

描述

返回結果集中的列數。

注意,你可以從指向結果集的指標或指向連線控制代碼的指標獲得列數。如果mysql_store_result()mysql_use_result()返回NULL應使用連線控制代碼(因而沒有結果集指標)。在該情況下,可呼叫mysql_field_count()來判斷mysql_store_result()是否生成了非空結果。這樣,客戶端程式就能採取恰當的行動,而不需要知道查詢是否是SELECT語句(或類似SELECT的語句)。

沒有實際的程式碼,終歸是紙上談兵,也不能加深我們的理解,下邊請看程式碼例項。

// ------------------databasemysql.h

#ifndef DATABASEMYSQL
#define DATABASEMYSQL

#include <mysql/mysql.h>
#include <string>

using std::string;

class DataseMysql
{
public:
    struct DatabaseInfo
    {
        string strHost;
        string strUser;
        string strPwd;
        string strDBName;
    };

public:
    DataseMysql();
    ~DataseMysql();

    bool Init(MYSQL* mysql, const string& host, const string& user, const string& passwd, const string& database);

    bool QuerySql(const char* sql);

private:
    // 控制代碼
    MYSQL * m_pMysql;

    // 結果集
    MYSQL_RES* m_pMysqlRes;

    // 行
    MYSQL_ROW m_row;

    // field
    MYSQL_FIELD * m_pMysqlField;

    bool m_bInit;

};

#endif // DATABASEMYSQL

// ------------------databasemysql.cpp

#include "databasemysql.h"
#include <iostream>
#include <string.h>

using namespace std;

DataseMysql::DataseMysql(void)
{
    m_bInit = false;
    m_pMysql = NULL;
    m_pMysqlRes = NULL;
    m_pMysqlField = NULL;
}

DataseMysql::~DataseMysql(void)
{
    if (m_pMysql != NULL)
    {
        if (m_bInit)
        {
            mysql_close(m_pMysql);
        }
    }
}

bool DataseMysql::Init(MYSQL *mysql, const string &host, const string &user, const string &passwd, const string &database)
{
    if (m_bInit)
    {
        mysql_close(m_pMysql);
    }

    m_pMysql = mysql_init(mysql);
    if (!m_pMysql)
    {
        cout << "mysql init failed." << endl;
        return false;
    }

    MYSQL* pMysql = NULL;
    pMysql = mysql_real_connect(m_pMysql, host.c_str(), user.c_str(), passwd.c_str(), database.c_str(), 0, NULL, 0);
    if (pMysql == m_pMysql)
    {
        cout << "connect succeed." << endl;
        mysql_query(pMysql, "set names utf8");
        return true;
    }
    else
    {
        cout << "failed: " << ", error: " << mysql_error(m_pMysql) << endl;
        return false;
    }
}

bool DataseMysql::QuerySql(const char *sql)
{
    int ret = 0;
    int len = strlen(sql);
    ret = mysql_real_query(m_pMysql, sql, len);
    if (ret)
    {
        cout << "DataseMysql::QuerySql failed." << endl;
        return false;
    }

    m_pMysqlRes = mysql_store_result(m_pMysql);
    if (!m_pMysqlRes)
    {
        cout << "m_pMysqlRes is null." << endl;
        return false;
    }
    my_ulonglong rowCount = 0;
    unsigned int fieldCount = 0;
    rowCount = mysql_affected_rows(m_pMysql);
    fieldCount = mysql_field_count(m_pMysql);

    // 遍歷結果集裡的情況.
    m_row = mysql_fetch_row(m_pMysqlRes);
    while (m_row)
    {
        for (int i = 0; i < fieldCount; ++i)
        {
            cout << m_row[i] << "\t\t";
        }
        cout << endl;

        m_row = mysql_fetch_row(m_pMysqlRes);
    }

    mysql_free_result(m_pMysqlRes);
}

// ------------------main.cpp

#include <iostream>
#include "databasemysql.h"

using namespace std;

int main()
{
    DataseMysql mysqlObj;
    if (!mysqlObj.Init(NULL, "localhost", "root", "root", "test"))
    {
        return -1;
    }

    //mysqlObj.QuerySql("select * from test");

    mysqlObj.QuerySql("show databases");
    cout << "Hello World!" << endl;
    return 0;
}


# ------------------CMakeLists.txt

project(testMysql)
cmake_minimum_required(VERSION 2.8)
#set(CMAKE_BUILD_TYPE DEBUG)
find_library(MYSQL_LIB libmysqlclient.so /usr/lib/)
if (NOT MYSQL_LIB)
    message(FATAL_ERROR "mysqlclient not found")
else (MYSQL_LIB)
    message("find")
endif(NOT MYSQL_LIB)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} mysqlclient)

輸出結果如下:

connect succeed.
information_schema		
myim		
mysql		
performance_schema		
sanilblog		
sys		
test		
Hello World!
這就是初識Linux c++呼叫mysql,由於時間關係,暫時這樣了,後續有時間再進行完善。