亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C/C++連接MySQL數(shù)據(jù)庫(kù)詳細(xì)圖文教程

 更新時(shí)間:2024年01月29日 10:32:18   作者:我的代碼愛(ài)吃辣  
在實(shí)際開發(fā)中我們經(jīng)常需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),下面這篇文章主要介紹了C/C++連接MySQL數(shù)據(jù)庫(kù)的詳細(xì)圖文教程,文中通過(guò)代碼以及圖文介紹是非常詳細(xì),需要的朋友可以參考下

一.準(zhǔn)備工作

要使用C語(yǔ)言連接mysql,需要使用mysql官網(wǎng)提供的庫(kù),大家可以去官網(wǎng)下載

我們使用C接口庫(kù)來(lái)進(jìn)行連接

要正確使用,我們需要做一些準(zhǔn)備工作:

  • 保證mysql服務(wù)有效
  • 在官網(wǎng)上下載合適自己平臺(tái)的mysql connect庫(kù),以備后用
  • 下載命令:sudo yum install mysql-devel

二.Connector/C 使用

如果是直接到MySQL官網(wǎng)下載的庫(kù),需要自己打包成庫(kù)使用,將生成的庫(kù)路徑寫入OS。

1.引入MySQL庫(kù)

mysql.c-api5.7function-reference

測(cè)試是否引入成功:

通過(guò) mysql_get_client_info() 函數(shù),來(lái)驗(yàn)證我們的引入是否成功;

#include <iostream>
#include </usr/include/mysql/mysql.h>
// 頭文件路徑+庫(kù)文件路徑+庫(kù)名
//-I/usr/include/mysql -L/usr/lib64/mysql/ -lmysqlclient
using namespace std;

int main()
{
    cout << "mysql client Version:" << mysql_get_client_info() << endl;
    return 0;
}

makefile:

test:test.cc
	g++ -o $@ $^ -std=c++11  -lmysqlclient 
.PHONY:clear
clear:
	rm -rf test

測(cè)試結(jié)果:

如果在編譯的時(shí)候出現(xiàn)找不到文件,就將完整的庫(kù)文件路徑,頭文件路徑指定清楚:

g++ -o test test.cc -std=c++11  -I/usr/include/mysql -L/usr/lib64/mysql/ -lmysqlclient

至此引入庫(kù)的工作已經(jīng)做完,接下來(lái)就是熟悉接口.

2.mysql接口介紹

初始化mysql_init():

要使用庫(kù),必須先進(jìn)行初始化!

MYSQL *mysql_init(MYSQL *mysql);

分配或初始化一個(gè)適用于mysql_real_connect()的MYSQL對(duì)象。如果mysql參數(shù)是一個(gè)空指針,函數(shù)將分配、初始化并返回一個(gè)新的對(duì)象。否則,對(duì)象將被初始化,并返回對(duì)象的地址。如果mysql_init()分配了一個(gè)新的對(duì)象,當(dāng)調(diào)用mysql_close()關(guān)閉連接時(shí),它將被釋放。

連接數(shù)據(jù)庫(kù)mysql_real_connect:

初始化完畢之后,必須先鏈接數(shù)據(jù)庫(kù),在進(jìn)行后續(xù)操作。(mysql網(wǎng)絡(luò)部分是基于TCP/IP的)

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_real_connect()嘗試建立與運(yùn)行在主機(jī)上的MySQL服務(wù)器的連接??蛻舳顺绦虮仨氃趫?zhí)行任何其他需要有效的MYSQL連接處理程序結(jié)構(gòu)的有效API函數(shù)之前成功連接到服務(wù)器。

第一個(gè)參數(shù) MYSQL是 C api中一個(gè)非常重要的變量(mysql_init的返回值),里面內(nèi)存非常豐富,有port,dbname,charset等連接基本參數(shù)。它也包含了一個(gè)叫 st_mysql_methods的結(jié)構(gòu)體變量,該變量里面保存著很多函數(shù)指針,這些函數(shù)指針將會(huì)在數(shù)據(jù)庫(kù)連接成功以后的各種數(shù)據(jù)操作中被調(diào)用。mysql_real_connect函數(shù)中各參數(shù),基本都是顧名思意。

mysql_real_connect() 的返回值是一個(gè)指向 MYSQL 連接句柄的結(jié)構(gòu)體指針。如果連接成功,返回值為非空指針;如果連接失敗,返回值為 NULL。

測(cè)試代碼:

#include <iostream>
#include </usr/include/mysql/mysql.h>
// 頭文件路徑+庫(kù)文件路徑+庫(kù)名
//-I/usr/include/mysql -L/usr/lib64/mysql/ -lmysqlclient
using namespace std;
const char *host = "118.178.232.144";
int main()
{
    cout << "mysql client Version:" << mysql_get_client_info() << endl;
    MYSQL *mpf = mysql_init(nullptr);
    MYSQL *mysql_connect = mysql_real_connect(mpf, host, "wangqing", "200209", "scott", 3306, nullptr, 0);
    if (mysql_connect)
        cout << "mysql connect success" << endl;
    else
        cout << "mysql connect fail" << endl;

    return 0;
}

下發(fā)mysql命令mysql_query:

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

第一個(gè)參數(shù)上面已經(jīng)介紹過(guò),第二個(gè)參數(shù)為要執(zhí)行的sql語(yǔ)句。

測(cè)試代碼:

    // 下達(dá)SQL指令
    int n = mysql_query(mysql_connect, "insert into stu value(8,'newsuer1')");
    int n = mysql_query(mysql_connect, "insert into stu value(9,'newsuer2')");
    int n = mysql_query(mysql_connect, "insert into stu value(10,'newsuer3')");

程序執(zhí)行后查看表的內(nèi)容:

獲取執(zhí)行結(jié)果mysql_store_result:

sql執(zhí)行完以后,如果是查詢語(yǔ)句,我們當(dāng)然還要讀取數(shù)據(jù),如果update,insert等語(yǔ)句,那么就看下操作成功與否即可。我們來(lái)看看如何獲取查詢結(jié)果: 如果mysql_query返回成功,那么我們就通過(guò)mysql_store_result這個(gè)函數(shù)來(lái)讀取結(jié)果。原型如下:

MYSQL_RES *mysql_store_result(MYSQL *mysql);

MYSQL_RES結(jié)構(gòu):

typedef struct st_mysql_res
{
    my_ulonglong row_count; // 行數(shù)
    MYSQL_FIELD *fields;    // 是一個(gè)數(shù)組,包含每一列信息,列名字,等屬性
    MYSQL_DATA *data;
    MYSQL_ROWS *data_cursor;
    unsigned long *lengths; /* column lengths of current row */
    MYSQL *handle;          /* for unbuffered reads */
    const struct st_mysql_methods *methods;
    MYSQL_ROW row;         /* If unbuffered read 表的內(nèi)容,數(shù)組指針,*/
    MYSQL_ROW current_row; /* buffer to current row */
    MEM_ROOT field_alloc;
    unsigned int field_count, current_field;
    my_bool eof; /* Used by mysql_fetch_row */
    /* mysql_stmt_close() had to cancel this result */
    my_bool unbuffered_fetch_cancelled;
    void *extension;
} MYSQL_RES;

該函數(shù)會(huì)調(diào)用MYSQL變量中的st_mysql_methods中的 read_rows 函數(shù)指針來(lái)獲取查詢的結(jié)果。同時(shí)該函數(shù)會(huì)返回MYSQL_RES 這樣一個(gè)變量,該變量主要用于保存查詢的結(jié)果。同時(shí)該函數(shù)malloc了一片內(nèi)存空間來(lái)存儲(chǔ)查詢過(guò)來(lái)的數(shù)據(jù),所以我們一定要記的 free(result),不然是肯定會(huì)造成內(nèi)存泄漏的。 執(zhí)行完mysql_store_result以后,其實(shí)數(shù)據(jù)都已經(jīng)在MYSQL_RES 變量中了,下面的api基本就是讀取 MYSQL_RES 中的數(shù)據(jù)。

獲取結(jié)果行數(shù)mysql_num_rows:

my_ulonglong mysql_num_rows(MYSQL_RES *res);

獲取結(jié)果列數(shù)mysql_num_fields:

unsigned int mysql_num_fields(MYSQL_RES *res);

獲取列名mysql_fetch_fields:

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

測(cè)定代碼:

#include <iostream>
#include <string>
#include <cstring>
#include </usr/include/mysql/mysql.h>
// 頭文件路徑+庫(kù)文件路徑+庫(kù)名
//-I/usr/include/mysql -L/usr/lib64/mysql/ -lmysqlclient
using namespace std;
const char *host = "118.178.232.144";
const char *user = "wangqing";
const char *pass = "200209";
const char *databases = "scott";
const int port = 3306;


int main()
{
    // 1.測(cè)試MySQL庫(kù)引入
    cout << "mysql client Version:" << mysql_get_client_info() << endl;
    // 2.創(chuàng)建MySQL對(duì)象
    MYSQL *mpf = mysql_init(nullptr);
    // 3.連接MySQL
    mysql_real_connect(mpf, host, user, pass, databases, port, nullptr, 0);
    if (mpf)
        cout << "mysql connect success" << endl;
    else
        cout << "mysql connect fail" << endl;

    // 4.下達(dá)SQL指令
    int n1 = mysql_query(mpf, "select * from stu");
    // int n2 = mysql_query(mpf, "insert into stu value(9,'newsuer2')");
    // int n3 = mysql_query(mpf, "insert into stu value(10,'newsuer3')");

    // 5.獲取執(zhí)行結(jié)果
    MYSQL_RES *ret = mysql_store_result(mpf);
    if (ret)
        cout << "read result success" << endl;
    else
        cout << "read result fail" << endl;
    // 5.1獲取行數(shù)
    my_ulonglong count_row = mysql_num_rows(ret);
    // 5.2獲取列數(shù)
    unsigned int count_col = mysql_num_fields(ret);
    cout << count_row << ":" << count_col << endl;

    // 5.3獲取列名
    // MYSQL_FIELD是一個(gè)結(jié)構(gòu)體,里面包含了該列的所有屬性
    MYSQL_FIELD *col_mess = mysql_fetch_fields(ret);
    for (int i = 0; i < count_col; i++)
    {
        cout << col_mess[i].name << "  ";
    }
    cout << endl;



    mysql_free_result(ret); // 釋放獲取執(zhí)行結(jié)果
    mysql_close(mpf);       // 關(guān)閉mysql連接

    return 0;
}

測(cè)試結(jié)果

獲取結(jié)果內(nèi)容mysql_fetch_row:

mysql_fetch_row獲取每一行的結(jié)果并且在下一次調(diào)用時(shí)自動(dòng)指向下一行:

    // 5.4獲取數(shù)據(jù)
    for (int i = 0; i < count_row; i++)
    {
        // MYSQL_ROW是一個(gè)字符串?dāng)?shù)組,存儲(chǔ)當(dāng)前行,每一列的數(shù)據(jù)
        MYSQL_ROW line = mysql_fetch_row(ret);
        for (int j = 0; j < count_col; j++)
            cout << line[j] << "\t";
        cout << endl;
    }

關(guān)閉mysql鏈接mysql_close :

void mysql_close(MYSQL *sock);

另外,mysql C api還支持事務(wù)等常用操作,大家下來(lái)自行了解:

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);

附:使用總結(jié)

1.#include<mysql.h>之前一定要加上#include<windows.h>否則會(huì)產(chǎn)生如下錯(cuò)誤:

1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(191) : error C2146: 語(yǔ)法錯(cuò)誤 : 缺少“;”(在標(biāo)識(shí)符“fd”的前面)
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(191) : error C4430: 缺少類型說(shuō)明符 - 假定為 int。注意: C++ 不支持默認(rèn) int
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(191) : error C4430: 缺少類型說(shuō)明符 - 假定為 int。注意: C++ 不支持默認(rèn) int
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(366) : error C2065: “SOCKET”: 未聲明的標(biāo)識(shí)符
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(366) : error C2146: 語(yǔ)法錯(cuò)誤 : 缺少“)”(在標(biāo)識(shí)符“s”的前面)
1>d:\my documents\visual studio 2008\projects\testmysql\testmysql\mysql\mysql_com.h(367) : error C2059: 語(yǔ)法錯(cuò)誤 : “)”

2.總結(jié)一下常用MySQL命令:

測(cè)試環(huán)境:MySQL 5.1.35
安裝MySQL之后,打開MySQL Command Line Client,輸入root密碼,即可操作數(shù)據(jù)庫(kù)

//查看MySQL版本
mysql> select version();

//顯示所有數(shù)據(jù)庫(kù)
mysql> show databases;

//使用數(shù)據(jù)庫(kù)
mysql> use database_name;

//顯示所有數(shù)據(jù)表
mysql> show tables;

//顯示數(shù)據(jù)表結(jié)構(gòu)
mysql> describe table_name;

//創(chuàng)建數(shù)據(jù)庫(kù)
mysql> create database database_name;

//刪除數(shù)據(jù)庫(kù)
mysql> drop database database_name;

//創(chuàng)建數(shù)據(jù)表
mysql> use database_name;
mysql> create table table_name (字段名 VARCHAR(20), 字段名 CHAR(1));

//刪除數(shù)據(jù)表
mysql> drop table table_name;

//查詢記錄
mysql> select * from table_name;

//導(dǎo)入.sql文件
mysql> use database_name;
mysql> source c:/mysql.sql

//修改root密碼
mysql> UPDATE mysql.user SET password=PASSWORD('新密碼') WHERE User='root';

//退出
mysql> quit

總結(jié) 

到此這篇關(guān)于C/C++連接MySQL數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)C/C++連接MySQL數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中求數(shù)組長(zhǎng)度的方法詳解

    C++中求數(shù)組長(zhǎng)度的方法詳解

    C++中沒(méi)有直接提供求數(shù)組長(zhǎng)度的方法,提供了sizeof(),begin(),end()等方法,可以供求數(shù)組長(zhǎng)度使用,文中通過(guò)代碼示例給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • C++菱形繼承和虛繼承的實(shí)現(xiàn)

    C++菱形繼承和虛繼承的實(shí)現(xiàn)

    本文主要介紹了C++菱形繼承和虛繼承的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C語(yǔ)言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解

    C語(yǔ)言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解

    下面小編就為大家?guī)?lái)一篇C語(yǔ)言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • C++創(chuàng)建多線程的方法總結(jié)

    C++創(chuàng)建多線程的方法總結(jié)

    下個(gè)迭代有個(gè)任務(wù)很有趣,用大量的線程去訪問(wèn)一個(gè)接口,直至其崩潰為止,這就需要多線程的知識(shí),這也不是什么難事,本文總結(jié)一下C++中的多線程方法std、boost、pthread、windows?api,感興趣的朋友可以參考下
    2024-01-01
  • C++ 類this及返回自身對(duì)象的引用方式

    C++ 類this及返回自身對(duì)象的引用方式

    這篇文章主要介紹了C++ 類this及返回自身對(duì)象的引用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 解析Linux下C++編譯和鏈接

    解析Linux下C++編譯和鏈接

    編譯&鏈接對(duì)C&C++程序員既熟悉又陌生,熟悉在于每份代碼都要經(jīng)歷編譯&鏈接過(guò)程,陌生在于大部分人并不會(huì)刻意關(guān)注編譯&鏈接的原理。本文通過(guò)開發(fā)過(guò)程中碰到的四個(gè)典型問(wèn)題來(lái)探索64位linux下C++編譯&鏈接的那些事。
    2021-05-05
  • c語(yǔ)言枚舉類型enum的用法及應(yīng)用實(shí)例

    c語(yǔ)言枚舉類型enum的用法及應(yīng)用實(shí)例

    enum是C語(yǔ)言中的一個(gè)關(guān)鍵字,enum叫枚舉數(shù)據(jù)類型,枚舉數(shù)據(jù)類型描述的是一組整型值的集合,這篇文章主要給大家介紹了關(guān)于c語(yǔ)言枚舉類型enum用法及應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • 基于C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲

    基于C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過(guò)問(wèn)題及解決

    C語(yǔ)言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過(guò)問(wèn)題及解決

    這篇文章主要介紹了C語(yǔ)言執(zhí)行時(shí),程序控制臺(tái)輸出窗口 一閃而過(guò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)快速排序

    C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)快速排序

    快速排序是一種不穩(wěn)定排序,這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)快速排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評(píng)論