C++連接MySQL數據庫


一、 創建項目並配置所需頭文件及庫

(一)     創建空項目

使用VS2015創建空項目

(二)     添加項目所需頭文件所在文件夾

右鍵項目選擇屬性,進入C/C++ => 常規 => 附加包含目錄,添加D:\mysql-5.7.19-win64\include(根據自己安裝的MySQL版本及地址填寫)

 

 

(三)     添加所需庫

仍在屬性頁,進入鏈接器 => 常規 => 附加庫目錄,添加D:\mysql-5.7.19-winx64\lib(根據自己情況填寫)

 

 

(四)     添加libmysql.dll

在項目的.\x64\Debug\中添加libmysql.dll(從計算機的資源管理器中添加),該dll文件在D:\mysql-5.7.19-winx64\lib目錄下

 

 

若為執行這步會出現以下錯誤:

 

二、 代碼測試

(一)     添加項,將下列代碼復制運行即可

#include "stdio.h"
#include "mysql.h"

int main()
{
    MYSQL * con; //= mysql_init((MYSQL*) 0); 
    MYSQL_RES *res;
    MYSQL_ROW row;
    char tmp[400];
    //database configuartion
    char dbuser[30] = "root";
    char dbpasswd[30] = "123456"; // it must be    changed
    char dbip[30] = "localhost";
    char dbname[50] = "hospital";
    char tablename[50] = "bl";
    char *query = NULL;

    int x;
    int y;
    int rt;//return value  
    unsigned int t;

    int count = 0;

    con = mysql_init((MYSQL*)0);

    if (con != NULL && mysql_real_connect(con, dbip, dbuser, dbpasswd, dbname, 3306, NULL, 0)) {
        if (!mysql_select_db(con, dbname)) {
            printf("Select successfully the database!\n");
            con->reconnect = 1;
            query = "set names \'GBK\'";
            rt = mysql_real_query(con, query, strlen(query));
            if (rt) {
                printf("Error making query: %s !!!\n", mysql_error(con));
            }
            else {
                printf("query %s succeed!\n", query);
            }
        }
    }
    else {
        MessageBoxA(NULL, "Unable to connect the database,check your configuration!", "", NULL);
    }

    //sprintf(tmp, "insert into %s values(%s,%d,%d)", tablename, "null", x, y); //注意如何向具有自增字段的數據庫中插入記錄
    sprintf(tmp, "insert into bl values(null,'x','x','x','x')");


    rt = mysql_real_query(con, tmp, strlen(tmp));
    if (rt)
    {
        printf("Error making query: %s !!!\n", mysql_error(con));
    }
    else
    {
        printf("%s executed!!!\n", tmp);
    }

    sprintf(tmp, "select * from %s", tablename);
    rt = mysql_real_query(con, tmp, strlen(tmp));
    if (rt)
    {
        printf("Error making query: %s !!!\n", mysql_error(con));
    }
    else
    {
        printf("%s executed!!!\n", tmp);
    }
    res = mysql_store_result(con);//將結果保存在res結構體中

    while (row = mysql_fetch_row(res)) {
        for (t = 0; t<mysql_num_fields(res); t++) {
            printf("%s  ", row[t]);
        }
        printf(".............\n");
        count++;
    }

    printf("number of rows %d\n", count);
    printf("mysql_free_result...\n");
    mysql_free_result(res);
    mysql_close(con);
    system("pause");
    return 0;
}

(二)     連接Mysql和從MySql中取出數據的部分API介紹

1.  mysql_real_connect()

1) 函數原型

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 int client_flag)

2) 參數及說明

• 第一個參數應該是一個現存MYSQL結構的地址。在調用mysql_real_connect()之前,你必須調用mysql_init()初始化MYSQL結構。見下面的例子。

• host值可以是一個主機名或一個IP地址。如果host是NULL或字符串"localhost",假定是到本地主機的一個連接。如果OS支持套接字(Unix)或命名管道(Win32),使用他們而不是TCP/IP與服務器連接。

• user參數包含用戶的MySQL登錄ID。如果user是NULL,假定是當前用戶。在Unix下,它是當前登錄名。在Windows ODBC下,必須明確地指定當前用戶名字。見16.4 怎樣填寫ODBC管理程序中各種域。

• passwd參數為user包含口令。如果passwd是NULL,只有在user表中對於有一個空白口令字段的用戶的條目將被檢查一個匹配。這允許數據庫主管設置MySQL權限,使用戶獲得不同的口令,取決於他們是否已經指定一個口令。注意:不要試圖在調用mysql_real_connect()前加密口令;口令加密自動被客戶API處理。

• db是數據庫名。如果db不是NULL,連接將缺省數據庫設置為這個值。

• 如果port不是0,值對於TCP/IP連接將用作端口號。注意host參數決定連接的類型。

• 如果unix_socket不是NULL,字符串指定套接字或應該被使用的命名管道。注意host參數決定連接的類型。

• client_flag值通常是0,但是在很特殊的情況下可以被設置為下列標志的組合:

標志名字 意味着的標志

CLIENT_FOUND_ROWS 返回找到的(匹配的)行數,不是受到影響的行數。

CLIENT_NO_SCHEMA 不允許db_name.tbl_name.col_name語法。這是為了ODBC;如果你使用該語法,導致語法分析器產生一個錯誤,它是為在一些ODBC程序捕捉錯誤是有用。

CLIENT_COMPRESS 使用壓縮協議。

CLIENT_ODBC 客戶是一個ODBC客戶。這使mysqld變得對ODBC更友好。

該函數用於連接數據庫

3) 返回值

如果連接成功,一個 MYSQL*連接句柄。如果連接失敗,NULL。對一個成功的連接,返回值與第一個參數值相同,除非你傳遞NULL給該參數。

4) 錯誤

CR_CONN_HOST_ERROR

不能連接MySQL服務器。

CR_CONNECTION_ERROR

不能連接本地MySQL服務器。

CR_IPSOCK_ERROR

不能創建一個IP套接字。

CR_OUT_OF_MEMORY

內存溢出。

CR_SOCKET_CREATE_ERROR

不能創建一個Unix套接字。

CR_UNKNOWN_HOST

不能找到主機名的IP地址。

CR_VERSION_ERROR

由於試圖使用一個不同協議版本的一個客戶庫與一個服務器連接導致的一個協議失配。如果你使用一個非常老的客戶庫連接一個沒有使用--old-protocol選項啟動的新服務器,這就能發生。

CR_NAMEDPIPEOPEN_ERROR;

不能在 Win32 上創建一個命名管道。

CR_NAMEDPIPEWAIT_ERROR;

不能在 Win32 上等待一個命名管道。

CR_NAMEDPIPESETSTATE_ERROR;

不能在 Win32 上得到一個管道處理器。

2.  mysql_select_db()

1) 函數原型

int mysql_select_db(MYSQL *mysql, const char *db)

2) 參數及說明

使得由db指定的數據庫成為 在由mysql指定的連接上的缺省(當前)數據庫。在隨后的查詢中,這個數據庫對於不包括一個顯式的數據庫指定符的表的引用是缺省數據庫。

除非連接的用戶能被認證允許使用數據庫,否則mysql_select_db()失敗。

3) 返回值

成功,零。如果發生一個錯誤,非零。

4) 錯誤

CR_COMMANDS_OUT_OF_SYNC

命令以一個不適當的次序被執行。

CR_SERVER_GONE_ERROR

MySQL服務器關閉了。

CR_SERVER_LOST

對服務器的連接在查詢期間失去。

CR_UNKNOWN_ERROR

發生一個未知的錯誤。

3.  mysql_real_query

1) 函數原型

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

2) 參數及說明

執行由query指向的SQL查詢,它應該是一個length個字節的字符串。查詢必須由一個單個的SQL語句組成。你不應該在語句后增加一個終止的分號(“;”)或\g。

對於包含二進制數據的查詢,你必須使用mysql_real_query()而不是mysql_query(),因為二進制代碼數據可能包含“\0”字符,而且,mysql_real_query()比mysql_query()更快,因為它對查詢字符串調用strlen()。

3) 返回值

如果查詢成功,零。如果發生一個錯誤,非零。

4) 錯誤

CR_COMMANDS_OUT_OF_SYNC

命令以一個不適當的次序被執行。

CR_SERVER_GONE_ERROR

MySQL服務器關閉了。

CR_SERVER_LOST

對服務器的連接在查詢期間失去。

CR_UNKNOWN_ERROR

發生一個未知的錯誤。 

4.  mysql_store_result

1) 函數原型

MYSQL_RES *mysql_store_result(MYSQL *mysql)

2) 參數及說明

用於將mysql_real_query查詢結果返回

3) 返回值

返回MYSQL_RES結構,如果獲取失敗則返回空

5.   mysql_fetch_row()

1) 函數原型

MYSQL_ROW *mysql_fetch_row(MYSQL_RES* res)

2) 參數及說明

用於讀取MYSQL_RES

3) 返回值

返回表示MYSQL_RES的下一行的MYSQL_ROW

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM