MYSQL C_API使用全解

文章目錄

  • C_API(簡單的)
    • 安裝這個庫
    • 使用流程
      • 初始化連接
        • mysql_init
      • 建立連接
        • mysql_real_connect
      • 執行SQL語句
        • mysql_query
      • 處理結果
        • mysql_store_result
        • msyql_use_result
        • mysql_num_rows
        • msyql_free_result
        • mysql_num_fields
        • mysql_fetch_row
        • 多線程安全
      • 關閉連接
        • mysql_close()
      • 檢驗API是否出錯
        • mysql_error

C_API(簡單的)

# MYSQL C_API結構體
- MYSQL         數據庫連接的類型,代表一個mysql連接
- MYSQL_RES     查詢返回的結果集,返回的多條數據構成的內存結構 不僅包含返回的二維的字符串數組 還有一些元數據信息
- MYSQL_ROW     一行記錄,字符串數組, row[0],...row[n-1]
- MYSQL_ROWS    由 MYSQL_ROW 構成的鏈表函數
- mysql_init            初始化數據庫連接,并沒有建立連接1.傳NULL,會自動分配地址,初始化之后返回2.如果有指針對象,返回的還是原來的地址
- mysql_close           釋放數據庫連接
- mysql_error           顯示錯誤信息,字符串顯示
- mysql_real_connect    建立數據庫連接,TCP套接字
- mysql_query           執行最簡單的sql語句;insert update DELETE select
- mysql_store_result    加載結果集,查詢語句之后使用,使用緩存在內存中會存儲一份
- mysql_use_result      加載select結果集
- mysql_free_result     釋放結果集
- mysql_num_rows        結果集中的元數據:行數
- mysql_num_fields      結果集中的元數據:列數
- mysql_fetch_row       從結果集獲得一行數據
- mysql_insert_id       獲得插入記錄自動生成的id

用戶發送請求,程序通過端口監聽用戶的,程序中會包含一系列的操作來訪問數據庫,但是mysql官方為我們封裝好了一系列的函數,我們可以通過函數來對mysql服務器進行訪問,獲得結果,對數據進行一系列的處理,然后返回給用戶。

安裝這個庫

locate mysql.hlocate libmysqlclient.so

只包含頭文件但是主要的代碼在動態庫中,所以在編譯的時候要將動態庫進行鏈接。

在這里插入圖片描述

使用流程

可以類比mysql自帶客戶端

# 給mysql的服務器的監聽端口,發送信息,建立連接,
mysql -u root -p123456# 操作完成會進入mysql的客戶端,就可以給服務器發送sql語句對數據進行操作。

初始化連接

mysql_init

在這里插入圖片描述

<img src="%E6%95%B0%E6%8D%AE%E5%BA%93.assets/image-20250618141917487.png" alt="image-20250618141917487" style="zoom:80%;

建立連接

mysql_real_connect

執行SQL語句

mysql_query

當一個連接,建立好之后可以查詢多次。

處理結果

mysql_store_result

適用于數據量較小的情況。會在內存申請空間。在內存中存儲一份。

注意:經驗又是沒有返回結果也不會返回null,所以最好拿到返回結果之后做一下判斷,如果是null,就是沒有返回數據,如果不是null,使用mysql_num_rows()函數,判斷是不是0,如果不是0,就進行常規的后續操作。

在這里插入圖片描述

msyql_use_result

mysql_num_rows

msyql_free_result

mysql_num_fields

mysql_fetch_row

獲取一行數據的信息

拿到的數據庫的存儲形式:

多線程安全

假如同一個進程中,有多個線程,如果我多個線程用來訪問一個靜態資源不會出現問題,但是現在我要沒有線程與mysql服務器都建立一個連接,然后他們都進行訪問同一動態資源,都調用mysql_init()函數,雖然unbantu說這個事線程安全函數(也就是說這個函數在設計的時候有加鎖)但是并不是這樣的,同時調用mysql_init函數可能會出現兩個線程拿到的是同一個連接,然后用于查詢的時候返回數據,接收數據的時候會出現數據讀取錯誤,但是我們不對mysql_init(),這個函數就行加鎖操作,我們不能對庫函數進行修改,但是我們可以自己封裝一個函數,這個函數的主要作用就是加鎖,執行庫函數,然后解鎖操作,來保證多線程的安全。

關閉連接

mysql_close()

檢驗API是否出錯

mysql_error

### 練習

#include <mysql/mysql.h>
#include <stdio.h>int main(void)
{//初始化連接MYSQL *mysql = mysql_init(NULL);//mysql 返回值要接收 就是初始化好的結構體指針// MYSQL *mysql = NULL;// mysql = mysql_init(mysql);//使用庫中的檢驗錯誤的函數 mysql_errorprintf("%s\n", mysql_error(mysql));// 建立到mysql服務器的連接 并且發送賬號密碼mysql_real_connect(mysql, "localhost", "root", "123456", "test_connect", 0, NULL, 0);printf("%s\n", mysql_error(mysql));//上面連接已經建立,賬號密碼已經驗證  -> 發送sql語句給mysql服務器// mysql_query(mysql, "insert into class values(NULL, 3)");//刪除數據mysql_query(mysql, "delete from class where id=6");//使用完成只之后要關閉連接mysql_close(mysql);return 0;
}
mysql> select * from class;
+----+------------+
| id | class_name |
+----+------------+
|  1 | 1          |
|  2 | 2          |
|  3 | 3          |
+----+------------+
3 rows in set (0.01 sec)
#include <mysql/mysql.h>
#include <stdio.h>int main(void)
{//初始化連接MYSQL *mysql = mysql_init(NULL);//mysql 返回值要接收 就是初始化好的結構體指針// MYSQL *mysql = NULL;// mysql = mysql_init(mysql);//使用庫中的檢驗錯誤的函數 mysql_errorprintf("%s\n", mysql_error(mysql));// 建立到mysql服務器的連接 并且發送賬號密碼mysql_real_connect(mysql, "localhost", "root", "123456", "test_connect", 0, NULL, 0);printf("%s\n", mysql_error(mysql));//只要是執行select sql語句,必須接收返回值,并且釋放//因為如果不接收返回值,下一次接收可能會接收到上一次的數據,導致數據錯亂 //發送sql語句mysql_query(mysql, "select * from class");//通過mysql_store_result()函數獲取mysql_query的返回值MYSQL_RES * res = mysql_store_result(mysql);//加返回值的驗證if(mysql_num_rows(res) != 0){//對數據進行處理MYSQL_ROW row;//從結果集中拿出一行,如果結果集中沒有更多數據或結果集為空,則返回NULLwhile((row = mysql_fetch_row(res))){unsigned int colunm;colunm = mysql_num_fields(res);for(int i = 0; i < colunm; i++){printf("%s  ", row[i]);}printf("\n");}}mysql_free_result(res);//使用完成只之后要關閉連接mysql_close(mysql);return 0;
}

mysql> select * from class;
+----+------------+
| id | class_name |
+----+------------+
|  1 | 1          |
|  2 | 2          |
|  3 | 3          |
|  4 | 3          |
|  5 | 3          |
+----+------------+
5 rows in set (0.00 sec)

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

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

相關文章

閑庭信步使用圖像驗證平臺加速FPGA的開發:第二課——RGB轉YCbCr的FPGA硬件編程詳解

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程文件請關注…

RK3566/RK3568 Android11 修改selinux模式

概述RK3566/RK3568 Android11 SDK默認的selinux是Enforcing模式(強制模式)。Enforcing&#xff1a;強制模式&#xff1a;SELinux在運行中&#xff0c;且已經開始限制domain/type之間的驗證關系 Permisssive&#xff1a;寬容模式&#xff1a;SELinux在運行中&#xff0c;如果驗證…

iOS Widget 開發-3:Widget 的種類與尺寸(主屏、鎖屏、靈動島)

iOS 支持多種類型的 Widget&#xff0c;分布在主屏幕、鎖屏、靈動島、待機模式、控制中心等多個系統位置。每種 Widget 都有各自的尺寸、交互能力與限制。 本篇將系統梳理 iOS 當前支持的 Widget 類型與尺寸規格。主屏 Widget&#xff08;Home Screen Widgets&#xff09; 主屏…

ffmpeg 中 write_option()函數詳細注釋

author: hjjdebug date: 2025年 07月 11日 星期五 10:51:23 CST descrip: ffmpeg 中 write_option()函數詳細注釋 文章目錄1. 函數原型1.1 參數說明1.2 SpecifierOpt 說明符選項結構2. write_option 代碼注釋2.1 誰調用了write_option 函數?3. 小結:write_option()不僅在ffmpe…

PandaCoder重大產品更新-引入Jenkinsfile文件支持

寫在前面 安裝這個插件可以直接平替 Jenkinsfile Pro &#xff0c;節省200元關于插件介紹的處女篇&#xff1a;https://mp.weixin.qq.com/s/fwMEhmx8vxVlvfnipx09Ag為什么叫「熊貓編碼助手」&#xff1f; 熊貓是中國的國寶&#xff0c;備受世界喜愛&#xff0c;代表著中國特色和…

鏈表算法之【判斷鏈表中是否有環】

目錄 LeetCode-141題 LeetCode-141題 給定一個鏈表的頭節點&#xff0c;判斷鏈表中是否存在環 class Solution {public boolean hasCycle(ListNode head) {// checkif (head null || head.next null)return false;// 定義兩個指針&#xff0c;一個快指針[fast]&#xff0c…

Ubuntu 22.04安裝SQL Server指南

看起來在安裝過程中出現了問題&#xff0c;導致 mssql-server 沒有正確安裝。以下是排查和修復步驟&#xff1a;1. 檢查是否成功安裝了 mssql-server 運行以下命令&#xff0c;確認是否已安裝&#xff1a; dpkg -l | grep mssql-server如果沒有任何輸出&#xff0c;說明 mssql-…

Vue+ElementUI聊天室開發指南

Hi&#xff0c;我是布蘭妮甜 &#xff01;在現代Web應用中&#xff0c;實時聊天功能已成為許多社交平臺、協作工具和客戶支持系統的核心需求。本文將詳細介紹如何使用Vue.js框架配合ElementUI組件庫實現一個功能完整的聊天室應用。我們將從項目搭建開始&#xff0c;逐步實現用戶…

提升你的AI交互技能:使用Anthropic互動提示教程

探索Anthropic的互動式提示工程教程&#xff1a;讓Claude與你更默契 在當今人工智能世界中&#xff0c;熟練掌握有效的提示工程成為了與AI進行高效溝通的關鍵。Anthropic推出了一款全面且互動性強的教程&#xff0c;名為“Prompt Engineering Interactive Tutorial”&#xff0…

從 JavaFX WebView 遷移至 JxBrowser

長久以來&#xff0c;JavaFX 一直包含一個內置的 WebView 組件&#xff0c;這是在 Java 應用中渲染 Web 內容的一個穩定方案。然而&#xff0c;在更復雜或要求更高的使用場景中&#xff0c;它可能就不夠用了。因此&#xff0c;許多開發者轉向了像 JxBrowser 這樣的替代方案。 …

將 Go 應用從 x86 平臺遷移至 Amazon Graviton:場景剖析與最佳實踐

簡介 近年來&#xff0c;Amazon Graviton 處理器以其優越的性價比和強勁的性能&#xff0c;成為了構建高效、可擴展云原生應用的重要選擇。Graviton 采用基于 Arm64 架構的芯片&#xff0c;與傳統的 x86 架構相比存在不少架構差異。雖然 Go 天生對 Arm64 具有良好支持&#xf…

arcgis api for js 設置地圖服務請求帶有請求頭信息

通過地圖的config模塊的請求攔截器來設置請求頭信息&#xff0c;如下示例&#xff1a; 1、引入&#xff1a;‘esri/config’ 1、設置請求頭信息 import { loadArcgisModules } from /utils/map/mapLoadUtil export default { mounted() {this.loadMap()}, methods: {/** ****…

工業通信升級新選擇:耐達訊CCLINKIE轉Modbus TCP網關

在工業自動化系統中&#xff0c;協議轉換網關的選擇直接影響系統穩定性與通信效率。對于CCLINKIE轉Modbus TCP場景&#xff0c;耐達訊通信技術網關憑借以下特性&#xff0c;成為多個項目中的優選方案。技術選型要點協議兼容性支持CCLINKIE的令牌環機制與Modbus TCP的TCP/IP協議…

使用python的 FastApi框架開發圖書管理系統-前后端分離項目分享

今天給大家分享一個 我最近使用python 框架 fastapi 寫的一個web項目 &#xff0c;叫圖書管理系統。項目主要是來鞏固 python的編程技術。使用的是前端后 分離開發。 主要實現的功能&#xff1a; 1、用戶管理&#xff1a;可以新增、編輯、刪除用戶信息。 2、圖書管理&#xff1…

上位機知識篇---Docker

Docker 詳細介紹 一、Docker 是什么 Docker 是一個開源的容器化平臺&#xff0c;它允許開發者將應用程序及其依賴項打包到一個標準化的單元&#xff08;稱為容器&#xff09;中&#xff0c;確保應用在任何環境中都能以相同的方式運行。 簡單來說&#xff0c;Docker 解決了 &…

藍橋杯第十六屆(2025)真題深度解析:思路復盤與代碼實戰

> 省一選手的血淚經驗:**避免這些坑,你也能沖進國賽!** 2025年藍橋杯省賽已落下帷幕,作為近年來**難度最高的一屆競賽**,不少選手在考場上遭遇了“滑鐵盧”。本文將以C++ B組真題為例,逐題解析解題思路,并提供**優化后的AC代碼與詳細注釋**。筆者最終排名省一前40%,…

使用gdal讀取shp及filegdb文件

一、使用qgis開源工具構建兩個文件&#xff0c;分別是filegdb和shp&#xff0c;每個文件包含一個圖層&#xff0c;圖層內容只包含一個字段&#xff1a;id&#xff0c;有兩個數據行&#xff0c;圖層幾何為多邊形&#xff0c;圖層都是如下的效果。二、使用rust讀取上述文件 rust依…

從0開始學習R語言--Day44--LR檢驗

之前我們提到用LM檢驗的方式&#xff0c;來判斷數據在空間上是否受到鄰近數據及其殘差的影響&#xff0c;但是LM檢驗是采用直接計算的方式&#xff0c;只關注了數據的殘差平方和&#xff0c;沒有數據關于依賴項的考慮&#xff0c;容易被結果誤導。而LR檢驗雖然在結果上有時候跟…

openEuler 24.03 (LTS-SP1) 下私有鏡像倉庫部署與自簽 SSL 全流程目標

目錄 openEuler 24.03 (LTS-SP1) 下私有鏡像倉庫部署與自簽 SSL 全流程 1 創建根 CA 與服務器證書&#xff08;修正版&#xff1a;SAN 寫法兼容所有 OpenSSL&#xff09; 2 配置 Docker Compose 文件 3 客戶端節點信任 CA 3.1 Docker 3.2 containerd 4 推送 / 拉取測試 …

mysql的LIMIT 用法

常見用法1. 限制返回行數-- 返回前5條記錄 SELECT * FROM products LIMIT 5;2. 分頁查詢&#xff08;帶偏移量&#xff09;-- 跳過前10條&#xff0c;返回接下來的5條記錄&#xff08;第11-15條&#xff09; SELECT * FROM products LIMIT 10, 5;-- MySQL 8.0 也支持這種語法 S…