C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的具體步驟
1、需要包含mysql API的頭文件
如果需要連接都本地的mysql數(shù)據(jù)庫,前提是本地要已經(jīng)安裝了mysql數(shù)據(jù)庫。這里要用到一些mysql的API,比如連接數(shù)據(jù)庫、執(zhí)行查詢語句等操作,這些接口都包含在下面的頭文件中:
#include <mysql/mysql.h>
2、連接mysql具體步驟
這里大致可以分為四個(gè)主要步驟:
1、連接mysql數(shù)據(jù)庫
1、連接mysql數(shù)據(jù)庫
顯然,如果要獲取mysql數(shù)據(jù)中數(shù)據(jù),首先要連接數(shù)據(jù)庫,獲得一個(gè)可以操作數(shù)據(jù)庫的句柄。
2、執(zhí)行查詢語句,即選擇我們需要的數(shù)據(jù)
就是執(zhí)行查詢語句,查詢我們需要的數(shù)據(jù)。查詢到的數(shù)據(jù)會(huì)保存在一個(gè)叫做結(jié)果集的地方。
3、從結(jié)果集中獲取需要的數(shù)據(jù)
利用相關(guān)的接口函數(shù),從結(jié)果集中獲取每一行各地字段的數(shù)據(jù)。
4、從結(jié)果集中提取每行各個(gè)字段的信息
5、釋放資源,包括結(jié)果集合mysql句柄
下面具體講解一下幾個(gè)必須用到的關(guān)鍵接口函數(shù)。
2.1 mysql_real_connect
該函數(shù)用于連接運(yùn)行在主機(jī)上的數(shù)據(jù)庫引擎,如果連接成功,將獲得可以操作數(shù)據(jù)庫的句柄,否則返回NULL指針。
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 )
該函數(shù)參數(shù)眾多,各個(gè)參數(shù)含義如下:
- mysql:是已有MYSQL結(jié)構(gòu)的地址。調(diào)用mysql_real_connect()之前,必須調(diào)用mysql_init()來初始化MYSQL結(jié)構(gòu)。
- host:是主機(jī)名或IP地址。如果“host”是NULL或字符串"localhost",連接將被視為與本地主機(jī)的連接。
- user:用戶的MySQL登錄ID。如果“user”是NULL或空字符串"",用戶將被視為當(dāng)前用戶。
- passwd:用戶的密碼。如果“passwd”是NULL,僅會(huì)對該用戶的(擁有1個(gè)空密碼字段的)用戶表中的條目進(jìn)行匹配檢查。
- db:是數(shù)據(jù)庫名稱。如果db為NULL,連接會(huì)將默認(rèn)的數(shù)據(jù)庫設(shè)為該值。
- port:如果“port”不是0,其值將用作TCP/IP連接的端口號。注意,“host”參數(shù)決定了連接的類型。
- unix_socket:如果unix_socket不是NULL,該字符串描述了應(yīng)使用的套接字或命名管道。注意,“host”參數(shù)決定了連接的類型。
- client_flag:值通常為0
2.2 mysql_query 或 mysql_real_query
該函數(shù)用于向數(shù)據(jù)庫發(fā)送一條查詢命令,并讓數(shù)據(jù)庫執(zhí)行。返回0表示查詢成功,否則失敗。
int mysql_query(MYSQL *mysql, const char *stmt_str)
或者:
int mysql_real_query(MYSQL *mysql, const char *stmt_str, unsigned long length)
- mysql:為通過獲取到的mysql操作句柄。
- stmt_str:表示需要執(zhí)行的查詢語句。
- length:為查詢語句的長度。
上面兩個(gè)函數(shù)的區(qū)別在于:
- mysql_query() 不能用于執(zhí)行帶二進(jìn)制的語句,也就是參數(shù)stmt_str中不能有二進(jìn)制數(shù)據(jù),會(huì)被解析成字符。
- mysql_query查速度稍慢一些,因?yàn)樾枰?jì)算查詢語句的長度
2.3 獲取結(jié)果集mysql_store_result
該函數(shù)返回查詢成功的結(jié)果集,如果失敗則返回NULL
MYSQL_RES *mysql_store_result(MYSQL *mysql)
2.4 顯示結(jié)果集中每行數(shù)據(jù)
該函數(shù)的入?yún)椴襟E(3)中返回的結(jié)果集。每次調(diào)用時(shí),返回結(jié)果集中的下一行數(shù)據(jù),并將指針向后移動(dòng)一行,如果沒有下一行數(shù)據(jù),返回NULL。
可以用mysql_num_fields(result)計(jì)算結(jié)果集中行的數(shù)量,mysql_num_fields(result)可以計(jì)算列的數(shù)量。假如row為某一行的信息,那么row[0]、row[1]。。。依次該行的各個(gè)字段信息。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
3、一個(gè)編程示例
這里的環(huán)境為linux系統(tǒng)。用到本地?cái)?shù)據(jù)庫名稱為:CrashCourse,查詢的表名稱為products,下面的編程實(shí)例中,演示了查詢products表中價(jià)錢大于30的所有項(xiàng)目。products表格完整內(nèi)容如下:
#include <stdio.h> #include <mysql/mysql.h> #include <iostream> using namespace std; MYSQL mysql; //mysql連接 MYSQL_RES* res; //結(jié)果集結(jié)構(gòu)體 MYSQL_ROW row; //char** 二維數(shù)組,存放記錄 int main() { // 步驟1: 初始化并連接數(shù)據(jù)庫,獲得操作數(shù)據(jù)庫的句柄 mysql_init(&mysql); //初始化 if (!(mysql_real_connect(&mysql, "localhost", "root", "root", "CrashCourse", 0, NULL, 0))) { cout << "Couldn't connect to Database!\n : " << mysql_error(&mysql); exit(1); } else { printf("Database connection succeeded. Connected...\n\n"); } // 步驟2: 執(zhí)行查詢語句,查詢需要的數(shù)據(jù)(設(shè)置編碼格式也相當(dāng)于執(zhí)行特殊的查詢語句) mysql_query(&mysql, "set names gbk"); // 設(shè)置編碼格式 mysql_query(&mysql, "SELECT * from products where prod_price > 30"); // 步驟3:獲取結(jié)果集 res = mysql_store_result(&mysql); // 步驟4:顯示結(jié)果集中每行數(shù)據(jù) int cols = mysql_num_fields(res); // 計(jì)算結(jié)果集中,列的個(gè)數(shù) while (row = mysql_fetch_row(res)) { for (int i = 0; i < cols; ++i) { cout << row[i] << "\t"; } cout << endl; } // 步驟5:釋放結(jié)果集合mysql句柄 mysql_free_result(res); mysql_close(&mysql); return 0; }
查詢結(jié)果如下:
總結(jié)
到此這篇關(guān)于C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的文章就介紹到這了,更多相關(guān)C++連接mysql并讀取數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 數(shù)據(jù)結(jié)構(gòu)完全二叉樹的判斷
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)完全二叉樹的判斷的相關(guān)資料,需要的朋友可以參考下2017-06-06strcpy函數(shù)實(shí)現(xiàn)簡示例命分享
這篇文章主要介紹了strcpy函數(shù)實(shí)現(xiàn)簡示例命,需要的朋友可以參考下2014-03-03C++?Qt開發(fā)之關(guān)聯(lián)容器類使用方法詳解
當(dāng)我們談?wù)摼幊讨械臄?shù)據(jù)結(jié)構(gòu)時(shí),順序容器是不可忽視的一個(gè)重要概念,Qt?中提供了豐富的容器類,用于方便地管理和操作數(shù)據(jù),本章我們將主要學(xué)習(xí)關(guān)聯(lián)容器,主要包括?QMap?,QSet和?QHash,感興趣的朋友跟著小編一起來學(xué)習(xí)吧2023-12-12C/C++產(chǎn)生隨機(jī)數(shù)函數(shù)簡單介紹
這篇文章主要為大家詳細(xì)介紹了C/C++產(chǎn)生隨機(jī)數(shù)函數(shù)的實(shí)現(xiàn)方法,如何使用C/C++產(chǎn)生隨機(jī)數(shù)函數(shù),感興趣的小伙伴們可以參考一下2016-04-04VS報(bào)錯(cuò)C6011的問題:取消對NULL指針的引用(解決方法)
這篇文章主要介紹了VS報(bào)錯(cuò)C6011的問題:取消對NULL指針的引用(解決方法),C6011:取消對NULL指針的引用,發(fā)現(xiàn)是沒有進(jìn)行空指針的判斷,解決方案跟隨小編一起看看吧2024-01-01