最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C/C++來連接 MySQL的使用

 更新時(shí)間:2026年06月29日 09:26:35   作者:橘頌TA  
本文主要介紹了使用C/C++來連接 MySQL的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、使用 C/C++ 來連接 MySQL

一般我們安裝好 MySQL 之后下面這些頭文件都是有的;

查看 MySQL 的頭文件:

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

int main()
{
    std::cout << "數(shù)據(jù)庫的版本:" << mysql_get_client_info() << std::endl;
    return 0;
}

連接 MySQL:

MYSQL *mysql_real_connect(
    MYSQL *mysql,           // 連接對(duì)象
    const char *host,       // 主機(jī):localhost / 127.0.0.1
    const char *user,       // 用戶名:root
    const char *passwd,     // 密碼
    const char *db,         // 要連接的數(shù)據(jù)庫名
    unsigned int port,      // 端口:3306
    const char *unix_socket,// 一般填 NULL
    unsigned long clientflag// 一般填 0
);

成功:返回一個(gè)非空的連接指針 失?。悍祷?NULL;

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

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

const std::string host = "127.0.0.1";
const std::string user = "lisi";
const std::string password = "123456";
const std::string db = "rootDB";
const unsigned int port = 8080;

int main()
{
    // std::cout << "數(shù)據(jù)庫的版本:" << mysql_get_client_info() << std::endl;

    MYSQL* my = mysql_init(nullptr);// 初始化對(duì)象
    if(!my)
    {
        std::cerr << "初始化失敗" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0) == nullptr)
    {
        std::cerr << "連接失敗" << std::endl;
        return 2;
    }

    std::cout << "連接成功" << std::endl;

    mysql_close(my);//釋放句柄
    return 0;
}

查看是否連接成功:

對(duì) MySQL 下達(dá)命令:

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

const std::string host = "127.0.0.1";
const std::string user = "lisi";
const std::string password = "123456";
const std::string db = "rootDB";
const unsigned int port = 8080;

int main()
{
    // std::cout << "數(shù)據(jù)庫的版本:" << mysql_get_client_info() << std::endl;

    MYSQL* my = mysql_init(nullptr);// 初始化對(duì)象
    if(!my)
    {
        std::cerr << "初始化失敗" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0) == nullptr)
    {
        std::cerr << "連接失敗" << std::endl;
        return 2;
    }

    // sleep(10);
    std::cout << "連接成功" << std::endl;

    std::string sql;
    while(true)
    {
        std::cout << "MYSQL>>> ";
        if(!std::getline(std::cin,sql) || sql == "quit;") break;
        int n = mysql_query(my,sql.c_str());//對(duì) MySQL 下達(dá)指令

        if(n == 0) std::cout << sql << "success " << n << std::endl;
        else std::cerr << sql << " failed" << n << std::endl;
    }
    mysql_close(my);//釋放句柄
    return 0;
}

一般這么寫:

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

const std::string host = "127.0.0.1";
const std::string user = "lisi";
const std::string password = "123456";
const std::string db = "rootDB";
const unsigned int port = 8080;

int main()
{
    // std::cout << "數(shù)據(jù)庫的版本:" << mysql_get_client_info() << std::endl;

    MYSQL* my = mysql_init(nullptr);// 初始化對(duì)象
    if(!my)
    {
        std::cerr << "初始化失敗" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0) == nullptr)
    {
        std::cerr << "連接失敗" << std::endl;
        return 2;
    }

    // sleep(10);
    std::cout << "連接成功" << std::endl;

    std::string sql = "update t2 set name='Jimy' where id=1";
    int n = mysql_query(my,sql.c_str());
    if(!n) std::cout << sql << " sucess" << std::endl;
    else std::cerr << sql << " failed" << std::endl;

    // while(true)
    // {
    //     std::cout << "MYSQL>>> ";
    //     if(!std::getline(std::cin,sql) || sql == "quit;") break;
    //     int n = mysql_query(my,sql.c_str());//對(duì) MySQL 下達(dá)指令

    //     if(n == 0) std::cout << sql << "success " << n << std::endl;
    //     else std::cerr << sql << " failed" << n << std::endl;
    // }
    mysql_close(my);//釋放句柄
    return 0;
}

如果編碼的客戶端(默認(rèn)是latin1)和服務(wù)端的編碼方式的不一樣,則設(shè)置編碼方式:

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

const std::string host = "127.0.0.1";
const std::string user = "lisi";
const std::string password = "123456";
const std::string db = "rootDB";
const unsigned int port = 8080;

int main()
{
    // std::cout << "數(shù)據(jù)庫的版本:" << mysql_get_client_info() << std::endl;

    MYSQL* my = mysql_init(nullptr);// 初始化對(duì)象
    if(!my)
    {
        std::cerr << "初始化失敗" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0) == nullptr)
    {
        std::cerr << "連接失敗" << std::endl;
        return 2;
    }

    mysql_set_character_set(my,"utf8");//設(shè)置編碼方式

    // sleep(10);
    std::cout << "連接成功" << std::endl;

    std::string sql = "insert into t2 (name) values ('李四')";
    int n = mysql_query(my,sql.c_str());
    if(!n) std::cout << sql << " sucess" << std::endl;
    else std::cerr << sql << " failed" << std::endl;

    // while(true)
    // {
    //     std::cout << "MYSQL>>> ";
    //     if(!std::getline(std::cin,sql) || sql == "quit;") break;
    //     int n = mysql_query(my,sql.c_str());//對(duì) MySQL 下達(dá)指令

    //     if(n == 0) std::cout << sql << "success " << n << std::endl;
    //     else std::cerr << sql << " failed" << n << std::endl;
    // }
    mysql_close(my);//釋放句柄
    return 0;
}

上面的操作中,對(duì)數(shù)據(jù)庫的增刪改都可以,都是查 select 的結(jié)果我們是需要討論一下的,當(dāng)我們 slect 的時(shí)候,查找的數(shù)據(jù)實(shí)際上會(huì)放到 MySQL* my 的 MySQL結(jié)構(gòu)體的緩沖區(qū)中的,為了這個(gè)結(jié)構(gòu)體的里面緩沖區(qū)的內(nèi)容讀出來,我們使用:MySQL_RES* res = mysql_store_result(my);

在MySQL中將所有的數(shù)據(jù)讀取出來的時(shí)候全部當(dāng)作字符串來處理;實(shí)際上 MySQL_RES 讀取數(shù)據(jù)的時(shí)候就像上面圖片一樣,MySQL_RES 里面有個(gè)指針數(shù)組,里面存儲(chǔ)的是另外一個(gè)數(shù)組的起始地址,那么另外一個(gè)數(shù)組存儲(chǔ)的是MySQL結(jié)構(gòu)體中緩沖區(qū)的數(shù)據(jù)(字符串)的地址;

注意:存儲(chǔ)到 res 的除了表的內(nèi)容還有列名:

為了方便讀取 res,我們要指定 res 里面的數(shù)據(jù)有多少行和列,進(jìn)而方便我們操作:

獲取行:my_ulonglong mysql_num_rows(MYSQL_RES*)

獲取列:my_ulonglong mysql_num_fields(MYSQL_RES*)

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

const std::string host = "127.0.0.1";
const std::string user = "lisi";
const std::string password = "123456";
const std::string db = "rootDB";
const unsigned int port = 8080;

int main()
{
    // std::cout << "數(shù)據(jù)庫的版本:" << mysql_get_client_info() << std::endl;

    MYSQL* my = mysql_init(nullptr);// 初始化對(duì)象
    if(!my)
    {
        std::cerr << "初始化失敗" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0) == nullptr)
    {
        std::cerr << "連接失敗" << std::endl;
        return 2;
    }

    mysql_set_character_set(my,"utf8");//設(shè)置編碼方式

    // sleep(10);
    std::cout << "連接成功" << std::endl;

    std::string sql = "select * from t2";
    int n = mysql_query(my,sql.c_str());//下達(dá)指令
    if(!n) std::cout << sql << " sucess" << std::endl;
    else std::cerr << sql << " failed" << std::endl;

    MYSQL_RES* res = mysql_store_result(my);//獲取 MYSQL 結(jié)構(gòu)體的里面緩沖區(qū)的數(shù)據(jù)
    if(!res)
    {
        //res = NULL
        std::cout << "獲取失敗" << std::endl;
        return 3;
    }

    my_ulonglong rows = mysql_num_rows(res);//獲取行
    my_ulonglong fields = mysql_num_fields(res);//獲取列

    std::cout << "行:" << rows << std::endl;
    std::cout << "列:" << fields << std::endl;
    

    // while(true)
    // {
    //     std::cout << "MYSQL>>> ";
    //     if(!std::getline(std::cin,sql) || sql == "quit;") break;
    //     int n = mysql_query(my,sql.c_str());//對(duì) MySQL 下達(dá)指令

    //     if(n == 0) std::cout << sql << "success " << n << std::endl;
    //     else std::cerr << sql << " failed" << n << std::endl;
    // }
    mysql_close(my);//釋放句柄
    return 0;
}

獲取某行(不包含屬性)的數(shù)據(jù)的起始地址:

MYSQL_ROW row = mysql_fetch_row(res);
#include <iostream>
#include <mysql/mysql.h>
#include <unistd.h>
#include <string>

const std::string host = "127.0.0.1";
const std::string user = "lisi";
const std::string password = "123456";
const std::string db = "rootDB";
const unsigned int port = 8080;

int main()
{
    // std::cout << "數(shù)據(jù)庫的版本:" << mysql_get_client_info() << std::endl;

    MYSQL *my = mysql_init(nullptr); // 初始化對(duì)象
    if (!my)
    {
        std::cerr << "初始化失敗" << std::endl;
        return 1;
    }

    if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "連接失敗" << std::endl;
        return 2;
    }

    mysql_set_character_set(my, "utf8"); // 設(shè)置編碼方式

    // sleep(10);
    std::cout << "連接成功" << std::endl;

    std::string sql = "select * from t2";
    int n = mysql_query(my, sql.c_str()); // 下達(dá)指令
    if (!n)
        std::cout << sql << " sucess" << std::endl;
    else
        std::cerr << sql << " failed" << std::endl;

    MYSQL_RES *res = mysql_store_result(my); // 獲取 MYSQL 結(jié)構(gòu)體的里面緩沖區(qū)的數(shù)據(jù), res 結(jié)果集
    if (!res)
    {
        // res = NULL
        std::cout << "獲取失敗" << std::endl;
        return 3;
    }

    // my_ulonglong rows = mysql_num_rows(res);//獲取行,注意:my_ulonglong 是 long long 類型
    // my_ulonglong fields = mysql_num_fields(res);//獲取列
    // 便于操作 
    int rows = mysql_num_rows(res);     // 獲取行
    int fields = mysql_num_fields(res); // 獲取列

    std::cout << "行:" << rows << std::endl;
    std::cout << "列:" << fields << std::endl;

    for(int i = 0; i < rows; i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);// 讀取一行的起始地址(數(shù)據(jù)), MYSQL_RPW 是 char**
        for(int j = 0; j < fields; j++)
        {
            std::cout << row[j] << "\t";//讀取一行中每列的數(shù)據(jù)(char*)
        }
        std::cout << std::endl;
    }

    // while(true)
    // {
    //     std::cout << "MYSQL>>> ";
    //     if(!std::getline(std::cin,sql) || sql == "quit;") break;
    //     int n = mysql_query(my,sql.c_str());//對(duì) MySQL 下達(dá)指令

    //     if(n == 0) std::cout << sql << "success " << n << std::endl;
    //     else std::cerr << sql << " failed" << n << std::endl;
    // }
    mysql_close(my); // 釋放句柄
    return 0;
}

從上面的結(jié)果上看,我們只獲取了表內(nèi)的內(nèi)容,沒有列名,所以:

獲取列名:

   //獲取結(jié)果集里面的所有列的屬性
    MYSQL_FIELD* fields_array = mysql_fetch_field(res);

MySQL_FILED 結(jié)構(gòu)體:

 顯而易見的 MYSQL_RES 結(jié)構(gòu)體定然開辟了許多的空間,跟我上面畫的圖一樣,所以當(dāng)我們不使用結(jié)果集的時(shí)候,要釋放掉他,不然就會(huì)造成內(nèi)存泄漏:

mysql_free_result(res);

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

const std::string host = "127.0.0.1";
const std::string user = "lisi";
const std::string password = "123456";
const std::string db = "rootDB";
const unsigned int port = 8080;

int main()
{
    // std::cout << "數(shù)據(jù)庫的版本:" << mysql_get_client_info() << std::endl;

    MYSQL *my = mysql_init(nullptr); // 初始化對(duì)象
    if (!my)
    {
        std::cerr << "初始化失敗" << std::endl;
        return 1;
    }

    if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "連接失敗" << std::endl;
        return 2;
    }

    mysql_set_character_set(my, "utf8"); // 設(shè)置編碼方式

    // sleep(10);
    std::cout << "連接成功" << std::endl;

    std::string sql = "select * from t2";
    int n = mysql_query(my, sql.c_str()); // 下達(dá)指令
    if (!n)
        std::cout << sql << " sucess" << std::endl;
    else
        std::cerr << sql << " failed" << std::endl;

    MYSQL_RES *res = mysql_store_result(my); // 獲取 MYSQL 結(jié)構(gòu)體的里面緩沖區(qū)的數(shù)據(jù), res 結(jié)果集
    if (!res)
    {
        // res = NULL
        std::cout << "獲取失敗" << std::endl;
        return 3;
    }

    // my_ulonglong rows = mysql_num_rows(res);//獲取行,注意:my_ulonglong 是 long long 類型
    // my_ulonglong fields = mysql_num_fields(res);//獲取列
    // 便于操作 
    int rows = mysql_num_rows(res);     // 獲取行
    int fields = mysql_num_fields(res); // 獲取列

    std::cout << "行:" << rows << std::endl;
    std::cout << "列:" << fields << std::endl;

    //獲取結(jié)果集里面的所有列的屬性
    MYSQL_FIELD* fields_array = mysql_fetch_field(res);
    for(int i = 0; i < fields; i++)
    {
        std::cout << fields_array[i].name << "\t";
    }
    std::cout << "\n";

    for(int i = 0; i < rows; i++)//讀取表的內(nèi)容
    {
        MYSQL_ROW row = mysql_fetch_row(res);// 讀取一行的起始地址(數(shù)據(jù)), MYSQL_RPW 是 char**
        for(int j = 0; j < fields; j++)
        {
            std::cout << row[j] << "\t";//讀取一行中每列的數(shù)據(jù)(char*)
        }
        std::cout << std::endl;
    }

    // while(true)
    // {
    //     std::cout << "MYSQL>>> ";
    //     if(!std::getline(std::cin,sql) || sql == "quit;") break;
    //     int n = mysql_query(my,sql.c_str());//對(duì) MySQL 下達(dá)指令

    //     if(n == 0) std::cout << sql << "success " << n << std::endl;
    //     else std::cerr << sql << " failed" << n << std::endl;
    // }
    mysql_free_result(res);
    mysql_close(my); // 釋放句柄
    return 0;
}

二、使用圖形化界面來連接 MySQL

執(zhí)行命令:選中和點(diǎn)擊閃電

可直接在圖形化的表進(jìn)行修改,然后進(jìn)行 apply:

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

相關(guān)文章

  • 詳解QT使用http通信的同步和異步

    詳解QT使用http通信的同步和異步

    在Qt與Http通信的時(shí)候,會(huì)根據(jù)不同的情況使用同步或者異步的方式進(jìn)行數(shù)據(jù)請(qǐng)求,下面我們就來深入了解一下http通信的同步和異步的相關(guān)知識(shí),感興趣的小伙伴可以了解下
    2023-12-12
  • C++ Boost PropertyTree示例超詳細(xì)講解

    C++ Boost PropertyTree示例超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • C語言數(shù)組a和&a的區(qū)別講解

    C語言數(shù)組a和&a的區(qū)別講解

    今天小編就為大家分享一篇關(guān)于C語言數(shù)組a和&a的區(qū)別講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C++ 如何實(shí)現(xiàn)一個(gè)日期類

    C++ 如何實(shí)現(xiàn)一個(gè)日期類

    通過對(duì)類和對(duì)象的學(xué)習(xí),理解了類是對(duì)象的抽象描述,實(shí)現(xiàn)日期類涉及定義年月日屬性及成員函數(shù)如打印日期、日期加減,重點(diǎn)介紹了運(yùn)算符重載的概念和作用,通過代碼示例展示了如何實(shí)現(xiàn)一個(gè)日期類,包括頭文件和源文件的分離編寫
    2024-10-10
  • C語言中g(shù)etchar函數(shù)詳解看這一篇就夠了(函數(shù)功能、使用、返回值)

    C語言中g(shù)etchar函數(shù)詳解看這一篇就夠了(函數(shù)功能、使用、返回值)

    getchar讀取字符的函數(shù),今天通過本文給大家介紹C語言中g(shù)etchar函數(shù)簡介用法示例詳解,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • C++實(shí)現(xiàn)簡易的彈球小游戲

    C++實(shí)現(xiàn)簡易的彈球小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡易的彈球小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 詳解C語言中Char型指針數(shù)組與字符數(shù)組的區(qū)別

    詳解C語言中Char型指針數(shù)組與字符數(shù)組的區(qū)別

    這篇文章主要介紹了詳解C語言中Char型指針數(shù)組與字符數(shù)組的區(qū)別的相關(guān)資料,希望通過本文能幫助到大家掌握理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • 利用OpenCV實(shí)現(xiàn)綠幕視頻背景替換

    利用OpenCV實(shí)現(xiàn)綠幕視頻背景替換

    這篇文章主要介紹了如何利用OpenCV實(shí)現(xiàn)綠幕視頻背景替換功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,感興趣的可以學(xué)習(xí)一下
    2022-01-01
  • Qt實(shí)現(xiàn)繪制多個(gè)設(shè)備的流量曲線圖詳解

    Qt實(shí)現(xiàn)繪制多個(gè)設(shè)備的流量曲線圖詳解

    這篇文章主要為大家詳細(xì)介紹了如何使用Qt開發(fā)繪制多個(gè)設(shè)備的流量曲線圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下
    2023-01-01
  • C++機(jī)房預(yù)約系統(tǒng)實(shí)現(xiàn)流程實(shí)例

    C++機(jī)房預(yù)約系統(tǒng)實(shí)現(xiàn)流程實(shí)例

    這篇文章主要介紹了C++機(jī)房預(yù)約系統(tǒng)實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10

最新評(píng)論

深州市| 齐河县| 石景山区| 迁安市| 兴宁市| 新源县| 淳化县| 新疆| 郑州市| 水富县| 黔西| 马山县| 汶川县| 亚东县| 福海县| 化隆| 宁晋县| 牙克石市| 周口市| 高淳县| 永安市| 宁化县| 东乌珠穆沁旗| 渝北区| 广东省| 长垣县| 靖宇县| 阳原县| 岚皋县| 获嘉县| 郎溪县| 治多县| 新竹县| 东兴市| 苏尼特左旗| 天祝| 宁明县| 海城市| 田林县| 九江县| 波密县|