MySQL資料庫學習筆記_11_Linux下C++/C連接MySQL資料庫數據庫(一)

Linux 下 C++/C 連接 MySQL 資料庫(一) 

一、連接前準備

原材料:Ubuntu12.04LTS

(已經安裝瞭MySQL5.5或者更高級版本,新立得軟件包,gcc/g++或者CodeBlosks編譯器)

安裝瞭以上的軟件包後,我們可以正常使用MySQL完成數據管理工作,但是很多時候我們需要通過編寫程式訪問MySQL。此時,在程式中需要加載MySQL驅動頭文件,但是默認這些驅動包是沒有安裝的,因此我們需要在新立得中找到"libmysqld-dev"包並安裝。

安裝完成之後,在”/usr/include/mysql/”目錄下會有很多相對應的頭文件,如mysql.h等。

當寫好程式,需要編譯時:

1、如果選用的是使用gcc/g++在命令行下完成,則需要加上-lmysqlclient選項。如:

g++ -lmysqlclient mysql_test.cc -o mysqltest

2、如果選用的是CodeBlocks,則需在構建選項中,將連接庫設為mysqlclient。

開始編譯。

二、頭文件及相關函數分析

這篇博客中所列的函數全部包含在頭文件<mysql/mysql.h>下,因此,需要在程式編寫開始處,加入一行:

#include <mysql/mysql.h>

1、用CAPI連接MySQL資料庫有兩個步驟:

1)初始化一個連接句柄

2)建立連接

所用到的函數如下:

MYSQL *mysql_init(MYSQL *connection);				// 初始化連接句柄
//成功返回MySQL結構指針,失敗返回NULL

MYSQL *mysql_real_connect(MYSQL *connection,   
                          const char *server_host,                          
                          const char *sql_user_name,  
                          const char *sql_password,   
                          const char *db_name,   
                          unsigned int port_number,   
                          const char *unix_socket_name,   
                          unsigned int flags); 	//建立連接
//成功返回MySQL結構指針,失敗返回NULL

2、MySQL連接工作完成之後,需要對MySQL的連接進行釋放

void mysql_close(MYSQL *connection); //關閉連接
//參數connection被清空,指針變為無效

3、mysql_options用於設置額外選項,並影響連接行為,但是它隻能在mysql_init和mysql_real_connect之間調用

int mysql_options(MYSQL *connection, enum mysql_option option, const char *argument); 				//設置連接選項  

option的值為下列四個值之一:

MYSQL_INIT_COMMAND	     //連接到MySQL伺服器時將執行的命令,再次連接時將自動再次執行。
MYSQL_OPT_CONNECT_TIMEOUT    //連接超時前的等待秒數
MYSQL_OPT_COMPRESS           //網絡連接中使用壓縮機制
MYSQL_OPT_PROTOCOL	     //要使用的協議類型,影視mysql.h中設定的mysql_protocol_type枚舉值之一

4、以上的函數是在假設沒有錯誤的情況下運行,如果資料庫連接過程中出現瞭錯誤,我們就需要以下兩個函數來處理錯誤信息:

unsigned int mysql_errno(MYSQL *connection);	//返回錯誤代碼(0表示為出現錯誤)  
char *mysql_error(MYSQL *connection); 			//返回錯誤信息,是以NULL作為終結的字符串 

5、程式訪問資料庫不隻是與資料庫建立連接,更重要的是通過SQL語句的執行查詢或改變資料庫中數據。執行SQL語句可以通過下列函數實現。

int mysql_query(MYSQL *connection, const char *query);

SQL語句分為兩類,返回數據的SQL和不返回數據的SQL(UPDATE、DELETE、INSERT)。

下面我們隻介紹不返回數據的SQL

my_ulonglong mysql_affected_rows(MYSQL *connection);	//返回查詢受影響的行
//對一段SQL語句執行後可以通過調用此函數查看SQL語句執行後,資料庫中數據狀態改變的行數,以此判斷SQL的執行成功與否。

三、實例

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <mysql/mysql.h>

using namespace std;

void mysql_err_function(MYSQL * connection);

int main()
{
	//freopen("input.txt","r",stdin);

    MYSQL * connection;
    connection = mysql_init(NULL);

    if (!connection)
    {
        cout << "mysql_init failed!" << endl;

        exit(-1);
    }

    if (!mysql_real_connect(connection,"localhost","root","123456","test",0,NULL,0))
    {
        cout << "Connection To MySQL failed!" << endl;
        mysql_err_function(connection);
    }

    cout << "Connection To MySQL Server is Success..." << endl;

    string str;
    getline(cin,str);

    int res = 0;
    int affected_count = 0;
    while (str != "close" && str != "" && !res)
    {
        res = mysql_query(connection,str.c_str());

        affected_count += mysql_affected_rows(connection);

        if (res)
        {
            if (mysql_errno(connection))
            {
                cout << "Error " << mysql_errno(connection) << " : "
                     << mysql_error(connection) << '\n' << endl;
                break;
            }
        }
        getline(cin,str);
    }


    cout << "Have affected " << affected_count << " rows!" << endl;

    mysql_close(connection);
    cout << "Connection To MySQL Server is closed..." << endl;

    return 0;
}

void mysql_err_function(MYSQL * connection)
{
    if (mysql_errno(connection))
    {
        cout << "Error " << mysql_errno(connection) << " : "
             << mysql_error(connection) << endl;

        exit(-1);
    }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *