Mysql系列--11、使用c/c++訪問mysql服務

目錄

一、準備

????????測試

二、創建對象

三、連接Mysql服務

四、下達指令

? ? ? ? 3.1增刪改

? ? ? ? ? ? ? ? 增加

編碼格式

? ? ? ? ? ? ? ? 刪除

? ? ? ? ? ? ? ? 修改

? ? ? ? 3.2查詢結果

????????結構體理解

????????打印屬性

????????打印數據


????????前面我們已經學習并練習了本地命令行形式的sql語句的使用,可在以后開發中我們一般

不會直接命令行操作數據庫,今天我們認識如何在自己的代碼中調用指令對數據庫進CURD操作。

所有操作函數均可以在mysql.com官方中查到使用手冊

一、準備

使用c或其他語言操作數據庫我們需要下載對應的第三方庫,并把我們需要的頭文件和庫路徑添加到對應程序編譯鏈接時的查詢位置。下載我們可以去官網下載。https://dev.mysql.com/downloads/

主要使用mysql.h文件:

庫需要遠程連接:

一般在/usr/lib64/libmysqlclient.so.20

或者在/lib64/libmysqlclient.so.20

我的在下面位置

????????測試

#include<iostream>
#include<mysql/mysql.h>int main()
{std::cout << "mysql test : " << mysql_get_client_info() << std::endl;return 0;
}

若能運行成功看到mysql版本就說明準備完成

二、創建對象

MYSQL * mysql_init(MYSQL*mysql)
eg:MYSQL*mfp = mysql_init(nullptr);返回:NULL if there was insufficient memory to allocate a new object.與mysql_close(MYSQL *)搭配使用,與打開關閉文件類似,防止空間浪費泄露

三、連接Mysql服務

申請完對象我們就可以連接mysql服務了。

首先我們要創建我們要連接的mysql服務用戶,不要直接使用root用戶,注意千萬不要把mysql的端口暴露在公網中,這里只是測試,用完請立即刪除,避免遭到攻擊!!!

MYSQL *mysql_real_connect(MYSQL *mysql,               --創建的mysql對象句柄const char *host,           --連接的用戶const char *user,           --連接的主機const char *passwd,         --連接所需的密碼const char *db,             --訪問哪個庫unsigned int port,          --訪問的端口const char *unix_socket,    --域間套接字直接設為null                                              unsigned long client_flag); --標記為設為0返回:A MYSQL* connection handler if the connection was successful, NULL if the connection was unsuccessful. For a successful connection, the return value is the same as the value of the first argument.

四、下達指令

????????連接成功后我們就可以利用相關語句執行我們的操作,由于select與其他操作不同所以分開描述

????????準備測試表:

int mysql_query(MYSQL *mysql,const char *stmt_str)mysql是我們申請的mysql對象,stmt_str是我們要操作的sql語句返回:Zero for success. Nonzero if an error occurred.

? ? ? ? 3.1增刪改

? ? ? ? ? ? ? ? 增加
    const char* sql = "insert into user values(1,'peter',18)";int n = mysql_query(mfp,sql);if(n == 0){std::cout << "query sucessed: " << sql << std::endl;}else{std::cerr << "query failed: " << mysql_error(mfp) << std::endl;return 1;}

編碼格式

? ? ? ? ? ? ? ? 刪除

刪除編碼格式錯誤的數據

? ? ? ? ? ? ? ? 修改

? ? ? ? 3.2查詢結果

若我們直接查發現并沒有任何數據回顯,顯然直接query拿不到查詢結果

為了拿到和命令行一樣的數據顯示,mysql提供了一塊空間用來儲存獲取的結果,并通過一些函數獲得數據

? ? ?

MYSQL_RES *mysql_store_result(MYSQL *mysql)
將結果放在MYSQL_RES *的結構體中返回:A pointer to a MYSQL_RES result structure with the results. NULL if the statement did not return a result set or an error occurred.搭配void mysql_free_result(MYSQL_RES *result)進行空間的獲取與釋放

上面代碼僅成功把結果放在了res結構體中,但我們還要打印才能拿到數據

????????結構體理解

對于上圖結構體我們可以看到其中的字段均是指針類型,本質還是指向一個結構體

對于這種指向我們可以把它抽象成一個獨特的二維數組進行理解,如圖:

所以我們在打印數據時也可以利用行列數和[下標]進行數據訪問

????????打印屬性
獲取二維數組列數my_ulonglong mysql_num_fields(MYSQL_RES*res)獲取列屬性內容MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES* res)
//打印列int field_count = mysql_num_fields(res);std::cout << "列數:" << field_count << std::endl;MYSQL_FIELD *field = mysql_fetch_fields(res);for(int i = 0; i < field_count; i++){std::cout << field[i].name << " ";}std::cout << std::endl;
????????打印數據
獲取二維數組行數
my_ulonglong mysql_num_rows(MYSQL_RES*res)獲取內容
MYSQL_ROW * mysql_fetch_row(MYSQL_RES*res)
返回:一個數據結構體

//打印列int field_count = mysql_num_fields(res);int row_count = mysql_num_rows(res);std::cout << "行數:" << row_count << std::endl;std::cout << "列數:" << field_count << std::endl;MYSQL_FIELD *field = mysql_fetch_fields(res);for(int i = 0; i < field_count; i++){std::cout << field[i].name << " ";}std::cout << std::endl;//打印數據(行)for(int i = 0; i < row_count; i++){MYSQL_ROW row = mysql_fetch_row(res);for(int j = 0; j < field_count; j++){std::cout << row[j] << " ";}std::cout << std::endl;}

代碼;

#include<iostream>
#include<mysql/mysql.h>const char*host = "localhost";
const char*user = "con";
const char*password = "123456";
const char*database = "conn";
const unsigned int port = 3306;int main()
{// std::cout << "mysql test : " << mysql_get_client_info() << std::endl;MYSQL* mfp = mysql_init(nullptr);if (mfp == nullptr) {std::cerr << "申請mysql對象失敗" << std::endl;return 1;}std::cout << "申請成功" << std::endl;MYSQL* conn = mysql_real_connect(mfp, host, user, password, database, port, nullptr, 0);if(conn == nullptr){std::cerr << "連接數據庫失敗" << std::endl;return 1;}std::cout << "連接成功" << std::endl;// //測試看是否連接成功// while(true)// {}//執行sql語句//統一編碼格式mysql_set_character_set(mfp, "utf8");// const char* sql = "insert into user values(1,'peter',18)";// const char* sql = "insert into user values(2,'jimmy',19)";// const char* sql = "insert into user values(3,'張三',20)";// const char* sql = "delete from user where id=3";// const char* sql = "update user set age=21 where id=2";const char* sql = "select * from user";int n = mysql_query(mfp,sql);if(n == 0){std::cout << "query sucessed: " << sql << std::endl;}else{std::cerr << "query failed: " << mysql_error(mfp) << std::endl;return 1;}//獲取結果集MYSQL_RES* res = mysql_store_result(mfp);if(res == nullptr){std::cerr << "獲取結果集失敗" << std::endl;return 1;}std::cout << "獲取結果集成功" << std::endl;//打印列int field_count = mysql_num_fields(res);int row_count = mysql_num_rows(res);std::cout << "行數:" << row_count << std::endl;std::cout << "列數:" << field_count << std::endl;MYSQL_FIELD *field = mysql_fetch_fields(res);for(int i = 0; i < field_count; i++){std::cout << field[i].name << " ";}std::cout << std::endl;//打印數據(行)for(int i = 0; i < row_count; i++){MYSQL_ROW row = mysql_fetch_row(res);for(int j = 0; j < field_count; j++){std::cout << row[j] << " ";}std::cout << std::endl;}mysql_free_result(res);mysql_close(mfp);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94735.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94735.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94735.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CS144 lab3 tcp_sender

0. 前言 這個實驗做了挺久的&#xff0c;剛開始做的時候官方的代碼庫還是開著的。 調著調著代碼官方把倉庫給刪掉了&#xff0c;又去找別人的代碼倉庫調發現不 對都打算放棄了&#xff0c;過了幾天發現了一個start-code的庫 再合進去簡直完美。這個實驗花的時間應該是前四個里面…

華為HCIP數通學習與認證解析!

大家好&#xff0c;這里是G-LAB IT實驗室。在信息技術飛速發展的今天&#xff0c;隨著華為產品和服務的廣泛應用&#xff0c;成為一名華為數通工程師無疑是許多年輕從業者的目標。然而&#xff0c;對于許多人來說&#xff0c;面對令人眼花繚亂的華為認證體系&#xff0c;不禁要…

深度學習入門Day10:深度強化學習原理與實戰全解析

一、開篇&#xff1a;智能決策的科學與藝術在前九天的學習中&#xff0c;我們掌握了處理各種數據類型的深度學習方法&#xff0c;但這些都屬于"被動學習"——模型從靜態數據中學習模式。今天&#xff0c;我們將進入一個全新的領域&#xff1a;強化學習&#xff08;Re…

Jenkins Pipeline(二)-設置Docker Agent

設計流水線的目的是更方便地使用 Docker鏡像作為單個 Stage或整個流水線的執行環境。 1.安裝必要插件 在Jenkins服務器上已經安裝了插件。 Docker PipelinePipeline Maven IntegrationPipeline Maven Plugin API 如果插件缺少什么&#xff0c;再次檢查并安裝即可。 2. 配…

神經網絡|(十六)概率論基礎知識-伽馬函數·中

【1】引言 前序學習進程中&#xff0c;已經初步了解了伽馬函數&#xff0c;認識到nnn的階乘計算可以轉化為&#xff1a; n!n!?limk→∞kn?k!(nk)!limk→∞kn?k!?n!(nk)!limk→∞kn?k!(n1)(n2)...(nk)n!n! \cdot lim_{k\rightarrow\infty}\frac{k^n\cdot k!}{(nk)!}\\lim_…

設計模式Books Reading

文章目錄 設計模式 創建型設計模式 工廠方法 示例說明 工廠方法模式結構 案例偽代碼 工廠方法模式適合應用 實現方式 工廠方法模式優缺點 與其他模式的關系 概念示例 抽象工廠 抽象工廠模式結構 抽象工廠模式適合應用場景 實現方式 抽象工廠模式優缺點 與其他模式的關系 代碼示…

接吻數問題:從球體堆疊到高維空間的數學奧秘

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 接吻數問題概述 接吻數問題&#xff08;Kissing Number Problem&am…

深度學習③【卷積神經網絡(CNN)詳解:從卷積核到特征提取的視覺革命(概念篇)】

文章目錄先言1. 卷積核&#xff1a;特征檢測的魔法窗口1.1什么是卷積核&#xff1a;可學習的特征檢測器1.2可視化理解&#xff1a;邊緣檢測、紋理提取、特征發現1.3代碼實現&#xff1a;使用PyTorch定義和初始化卷積層2. 卷積運算的數學原理2.1.離散卷積計算&#xff1a;滑動窗…

當不想安裝telnet或nc時,可使用 Linux 系統默認自帶的bash原生網絡功能或ping(輔助判斷)測試連通性

1. 用bash原生/dev/tcp測試端口&#xff08;無需任何工具&#xff09;bashshell 內置了/dev/tcp虛擬設備&#xff0c;可直接通過腳本測試端口是否能連接&#xff0c;執行以下命令&#xff08;替換數據庫 IP 和端口&#xff09;&#xff1a;# 格式&#xff1a;echo > /dev/tc…

【STM32外設】ADC

聲明&#xff1a;上圖是STM32產品型號各字段含義&#xff0c;本文基于STM32F103 1、ADC的一些概念 常規通道(常規組)和注入通道(注入組)&#xff08;regular channels and injected channels&#xff09;ADC支持的外部通道總共16個&#xff08;且被3個ADC共享&#xff0c;ADC12…

Aha Moment——啊哈時刻!

1. 理解面試官的意圖面試官問你“Aha moment”&#xff0c;其實是想知道&#xff1a;你是否真正理解這個概念&#xff1a;不只是背定義&#xff0c;而是理解其為什么重要。你如何發現它&#xff1a;考察你的數據分析方法論和技術能力&#xff08;用了哪些數據、指標、模型&…

RAG教程5:多表示索引和ColBERT

文章目錄 導入依賴包 多表示索引 ColBERT 導入依賴包 %pip install youtube-transcript-api pytube多表示索引 from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitterloader = WebBaseL

來自火山引擎的 MCP 安全授權新范式

資料來源&#xff1a;火山引擎-開發者社區 本文旨在深入剖析火山引擎 Model Context Protocol (MCP) 開放生態下的 OAuth 授權安全挑戰&#xff0c;并系統闡述火山引擎為此構建的多層次、縱深防御安全方案。面對由 OAuth 2.0 動態客戶端注冊帶來的靈活性與潛在風險&#xff0c;…

瑞芯微RK3506開發板PWM輸入捕獲驅動調試記錄

本文演示PWM輸入信號采集&#xff0c;基于觸覺智能RK3506開發板。配置為&#xff1a; 3核Cortex-A7Cortex-M0多核異構處理器 主要接口&#xff1a;2路CAN FD&#xff0c;5路串口&#xff0c;RGB、MIPI、音頻、USB2.0 OTG等、板載雙百兆網口4G星閃SLEWiFi6BLE5.2。 PWM信號簡…

PHP的header()函數分析

PHP的header()函數是HTTP協議交互的核心工具&#xff0c;它通過直接操縱響應頭實現服務器與客戶端之間的元數據通信。作為PHP原生函數&#xff0c;其設計初衷是處理HTTP協議層的關鍵操作&#xff0c;包括狀態碼設置、內容類型聲明和緩存控制等基礎功能。在Web開發中&#xff0c…

根據并發和響應延遲,實現語音識別接口自動切換需求

根據并發和響應延遲&#xff0c;語音識別接口自動 切換需求 需求描述&#xff1a; 當請求的語音識別的請求數量大于3或者請求語音識別接口3秒不可達無響應&#xff0c;切換備用語音識別接口 科大訊飛語音識別作為備用接口 科大訊飛的API文檔: 進入訊飛開放平臺的網頁&#…

程序員之電工基礎-CV程序解決目標檢測

一、背景 興趣愛好來了&#xff0c;決定研發一個產品。涉及到電工和機械等知識&#xff0c;所以記錄一下相關的基礎知識。今天的內容又回到了我的主營板塊&#xff01;&#xff01;哈哈&#xff01;&#xff01;為后續整體集成做準備&#xff0c;先測試目標檢測部分的能力。 二…

B樹的概述以及插入邏輯

一&#xff0c;B樹的概述1.B樹(B-樹)又稱多路平衡查找樹&#xff0c;B樹所有節點中孩子數量的最大值n稱為B樹的階&#xff0c;通常用m表示比如當m為2就是常見的二叉樹一顆m階的B樹定義如下&#xff1a;1)每個結點最多有m-1個關鍵字&#xff1b;2)根節點最少可以只有1個關鍵字;3…

如何用 Kotlin 在 Android 手機開發一個小鬧鐘、計時器、秒表

以下是在 Android 上用 Kotlin 開發小鬧鐘、計時器和秒表的方法&#xff0c;分為核心功能實現和界面設計兩部分&#xff1a; 鬧鐘功能實現 AlarmManager 和 BroadcastReceiver // 設置鬧鐘 val alarmManager getSystemService(Context.ALARM_SERVICE) as AlarmManager val i…

LeetCode Hot 100 第8天

1. 73 矩陣置零&#xff08;記錄標識&#xff09; 鏈接&#xff1a;題目鏈接 題解&#xff1a; 題解 時間復雜度O(n*m)&#xff1a; 方案1(空間復雜度O(n m))&#xff1a;matrix[i][j] 0&#xff0c;意味著 第i行、第j列所有元素都要置為0&#xff1b;維護能置為0行、列的集…