linux下c語言訪問mysql數據庫

一、連接數據庫基礎

1. 頭文件與庫文件

連接 MySQL 需包含的頭文件:

#include <mysql/mysql.h>
// 部分環境也可用 #include <mysql.h> 

編譯鏈接時,Linux 平臺需指定庫名:-lmysqlclient?,用于鏈接 MySQL 客戶端函數庫。

2. 初始化連接句柄

MYSQL *mysql_init(MYSQL *mysql);
  • 功能:初始化 MySQL 連接句柄。若參數為?NULL,會分配新的連接句柄并返回其指針;若參數是已有的結構,會重新初始化 。
  • 返回值:成功返回連接句柄指針,出錯返回?NULL?。

3. 連接數據庫

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 clientflag);
  • 參數說明:
    • mysqlmysql_init?初始化后返回的連接句柄指針。
    • host:主機名或 IP 地址,本地可填?"localhost""127.0.0.1"?或空字符串、NULL?。
    • user:數據庫用戶名,如管理員用戶?root?。
    • passwd:用戶密碼 。
    • db:要連接的數據庫名 。
    • port:數據庫端口,默認?3306,填?0?則用默認端口 。
    • unix_socket:一般填?NULL,表示不使用 Unix 套接字或管道 。
    • clientflag:標志位,通常填?0?。
  • 返回值:成功返回與第一個參數相同的連接句柄指針,失敗返回?NULL?。

4. 關閉連接

void mysql_close(MYSQL *mysql);

功能:關閉 MySQL 連接,釋放相關資源,不再使用連接時調用。

二、SQL 語句執行與結果處理

1. 執行 SQL 語句

int mysql_query(MYSQL *mysql, const char *q);
  • 參數:
    • mysql:連接成功后的句柄指針。
    • q:要執行的 SQL 語句,末尾可不帶分號(與命令行工具使用有區別 )。
  • 返回值:成功返回?0;若 SQL 語句含二進制數據,建議用?mysql_real_query?。

2. 提取結果

MYSQL_RES *mysql_store_result(MYSQL *mysql); // 一次性提取所有結果數據
// MYSQL_RES *mysql_use_result(MYSQL *mysql); // 一次提取一行數據(按需獲取,適合大數據量)
  • 功能:mysql_query?成功執行后調用,mysql_store_result?會把結果集全部加載到客戶端內存,返回指向結果集結構的指針;mysql_use_result?按需獲取數據,更節省內存,但需按行讀取并及時處理 。
  • 返回值:成功返回結果集指針,失敗返回?NULL?。

3. 獲取結果集行數

uint64_t mysql_num_rows(MYSQL_RES *res);
  • 說明:需在執行?mysql_store_result?后調用,用于獲取結果集中記錄的行數,無返回行則為?0?。

4. 取出結果集一行記錄

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
  • 功能:從結果集中取出一行,存儲到行結構中。數據處理完或出錯時返回?NULL,常配合循環遍歷結果集 。

5. 查看記錄行列數

unsigned int mysql_field_count(MYSQL *mysql);

功能:獲取結果集中一行記錄的列數 。

6. 釋放結果集內存

void mysql_free_result(MYSQL_RES *result);

功能:處理完結果集后調用,釋放結果集占用的內存空間 。

7. 獲取錯誤信息

unsigned int mysql_errno(MYSQL *mysql); // 返回錯誤碼
const char *mysql_error(MYSQL *mysql); // 返回錯誤信息描述
  • 功能:執行操作出錯時,可調用獲取錯誤碼和詳細錯誤描述,用于調試排查問題 。

8. 簡單示例

#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>int main()
{MYSQL mysql;if (mysql_init(&mysql) == NULL){printf("mysql init err\n");return 0;}if (mysql_real_connect(&mysql, "localhost", "root", "123456", "testdb", 3306, NULL, 0) == NULL){printf("connect mysql failed\n");return 0;}printf("connect mysql success\n");// char* sql = "insert into student2 values(6,'小王')";char* sql = "select * from student2";int query_res = mysql_query(&mysql, sql);if (query_res != 0){printf("query err:%s\n", mysql_error(&mysql));return 0;}// MYSQL_RES * mysql_res =mysql_use_result(&mysql);MYSQL_RES * mysql_res = mysql_store_result(&mysql);if (mysql_res == NULL){printf("result err:%s\n", mysql_error(&mysql));return 0;}// 判斷返回的行數int num = mysql_num_rows(mysql_res);if (num == 0){printf("沒有記錄\n");return 0;}printf("得到:%d 條記錄\n", num);MYSQL_ROW sqlrow;for (int i = 0; i < num; i++){sqlrow = mysql_fetch_row(mysql_res);if (sqlrow == NULL){printf("數據處理完,或者出錯\n");break;}// 判斷列數int fields = mysql_field_count(&mysql);for (int j = 0; j < fields; j++){printf("fieds[%d]=%s\n", j, sqlrow[j]);}}// MYSQL_ROW  sqlrow = NULL;// while( ( sqlrow = mysql_fetch_row(mysql_res)) )// {//     //printf("sqlrow[0]=%s,sqlrow[1]=%s\n",sqlrow[0],sqlrow[1]);//// }mysql_free_result(mysql_res);mysql_close(&mysql);return 0;
}

邏輯說明

  1. 初始化連接句柄,調用?mysql_init?。
  2. 調用?mysql_real_connect?連接數據庫,參數填入主機、用戶、密碼等信息。
  3. 定義 SQL 語句,用?mysql_query?執行查詢。
  4. 執行?mysql_store_result?獲取結果集,判斷是否為空。
  5. 調用?mysql_num_rows?獲取結果行數,遍歷結果集,用?mysql_fetch_row?逐行讀取,結合?mysql_field_count?遍歷列數據并打印。
  6. 最后用?mysql_free_result?釋放結果集,mysql_close?關閉連接。

?

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

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

相關文章

6. 傳輸層協議 UDP

傳輸層負責數據能夠從發送端傳輸接收端.1. 再談端口號端口號(Port)標識了一個主機上進行通信的不同的應用程序在 TCP/IP 協議中, 用 "源 IP", "源端口號", "目的 IP", "目的端口號", "協議號" 這樣一個五元組來標識一個通信…

vue 開發總結:從安裝到第一個交互頁面-與數據庫API

vue 總結 1、安裝vue&#xff1a; WinR 輸入&#xff1a;cnpm install -g vue/cli 驗證是否安裝成功&#xff1a;vue --version 2、新建Vue工程 在對應文件夾下右擊打開集成終端 輸入 vue create query_system&#xff08;新建項目名字&#xff09;名稱不能存在大寫&#x…

運維筆記:HTTP 性能優化

一、HTTP 協議特性與性能瓶頸1.1 HTTP 協議發展歷程HTTP 協議的演進直接影響著 Web 性能&#xff0c;各版本關鍵特性對比&#xff1a;協議版本發布時間核心特性性能優勢局限性HTTP/1.01996 年無狀態、短連接簡單易實現每次請求需建立 TCP 連接HTTP/1.11999 年長連接、管道化減少…

ubuntu:運行gcfsd-admin守護進程需要認證,解決方法

這里有個鎖子&#xff0c;每次進入都要輸入密碼&#xff0c;怎么解決&#xff1f; 重新掛載 /data 磁盤 sudo umount /data sudo ntfsfix /dev/sda1 sudo mount -o rw /dev/sda1 /data

1.DRF 環境安裝與配置

文章目錄一. Django Rest_Framework二、環境安裝與配置2.1 安裝 DRF2.2 創建Django項目2.3 添加 rest_framework 應用三、啟動項目一. Django Rest_Framework 核心思想&#xff1a;大量縮減編寫 api 接口的代碼 Django REST framework 是一個建立在 Django 基礎之上的 Web 應…

設計模式(十九)行為型:備忘錄模式詳解

設計模式&#xff08;十九&#xff09;行為型&#xff1a;備忘錄模式詳解備忘錄模式&#xff08;Memento Pattern&#xff09;是 GoF 23 種設計模式中的行為型模式之一&#xff0c;其核心價值在于在不破壞封裝性的前提下&#xff0c;捕獲并外部化一個對象的內部狀態&#xff0c…

Qt/C++開發監控GB28181系統/錄像回放/切換播放進度立即跳轉/支持8倍速播放/倍速和跳轉進度無縫切換

一、前言說明 在國標監控系統中&#xff0c;錄像回放過程中&#xff0c;需要切換播放進度&#xff0c;對比過很過國標系統&#xff0c;絕大部分尤其是網頁版的監控系統&#xff0c;在切換進度過程中都會黑屏&#xff0c;這個體驗就很不友好了&#xff0c;明明gb28181協議中就有…

【11】大恒相機SDK C++開發 ——原圖像數據IFrameData內存中上下顛倒,怎么裁剪ROI 實時顯示在pictureBox中

文章目錄3 當內存中的 圖像數據是垂直翻轉的時候怎么截取ROI 并顯示3.1 對ROI在原圖中的位置做轉換3.2 將ROI的最后一行當做開始位置&#xff0c;從底部向上復制數據3.3 完整代碼3.4 圖像數據在內存中上下顛倒的情況3.5 調用驗證4 unsafe代碼 解釋及注意事項 看我另一篇文章5 C…

小架構step系列29:校驗注解的組合

1 概述如果遇到某些屬性需要多種校驗&#xff0c;比如需要非空、符合某正則表達式、長度不能超過某值等&#xff0c;如果這種屬性只有有限幾個&#xff0c;那么手工把對應的校驗注解都加上即可。但如果這種屬性比較多&#xff0c;那么重復加這些校驗注解&#xff0c;也是一種代…

網絡基礎19:OSPF多區域實驗

一、拓撲結構1. 網絡拓撲&#xff1a;骨干區域&#xff08;Area 0&#xff09;&#xff1a;連接核心設備&#xff08;AR1、AR2、AR3、AR4、AR5、AR6&#xff09;。非骨干區域&#xff1a;Area 1&#xff1a;AR5 ? AR9Area 2&#xff1a;AR5 ? AR10Area 3&#xff1a;AR6 ? A…

goland編寫go語言導入自定義包出現: package xxx is not in GOROOT (/xxx/xxx) 的解決方案

問題 寫了個自定義的包 calc.go&#xff0c;在路徑 $GOPATH/go_project/src/demo_51_package/com/目錄下&#xff0c;其中main.go 是main方法的入口代碼 main.go 代碼如下 package main import "demo_51_package/com" func main() {add : calc.Add(1, 2)println(add)…

HLS視頻切片音頻中斷問題分析與解決方案

HLS視頻切片音頻中斷問題分析與解決方案 問題背景 在使用FFmpeg進行HLS視頻切片并通過hls.js前端播放時&#xff0c;開發者經常遇到一個典型問題&#xff1a;第一個視頻切片播放正常且有聲音&#xff0c;但后續切片卻突然失去音頻。這種現象在直播和點播場景中均有出現&#xf…

【Linux網絡編程】網絡層協議 - IP

目錄 背景補充 協議頭格式 IP報文的分片與組裝 網段劃分 網段劃分是什么&#xff1f;為什么要進行網段劃分&#xff1f; 怎么進行網段劃分&#xff1f; 路由 路由表生成算法 背景補充 假設現在主機B要給主機C發送消息。在我們前面的學習中&#xff0c;一直都是將數據拷…

從“救火”到“先知”:潤建曲尺運維大模型如何重構網絡運維價值鏈

“7月18號&#xff0c;北京&#xff0c;晴&#xff0c;最高溫度38攝氏度。”天氣預報緩緩播報&#xff0c;商場、地鐵、辦公樓無不歌頌著威利斯開利的貢獻&#xff0c;但這份涼爽的背后&#xff0c;離不開 “電” 的無聲托舉。5G毫秒級下載、絲滑的移動支付、智能電表、智能家居…

Element表格單元格類名動態設置

在 Element UI 的 el-table 組件中&#xff0c;cell-class-name 屬性用于動態自定義表格單元格的 CSS 類名&#xff0c;通常用于根據數據條件設置樣式。1. 基本用法在 el-table 上綁定 :cell-class-name 屬性&#xff0c;值為一個函數。該函數接收一個對象參數&#xff0c;返回…

利用容器適配器實現stack和queue外加deque的介紹(STL)

文章目錄前言什么是容器適配器&#xff1f;觀察庫中的源碼那么該如何使用容器適配器呢&#xff1f;deque的簡單介紹(了解)deque的原理介紹deque的優缺為什么選擇deque作為stack和queue的底層默認容器&#xff1f;&#xff08;重點&#xff09;利用容器適配器實現我們自己的棧和…

【因子動物園巡禮】第12章:機器學習在因子投資中的應用(中文翻譯)

【因子動物園巡禮】第12章&#xff1a;機器學習在因子投資中的應用&#xff08;中文翻譯&#xff09;第12章 因子投資中的機器學習12.1 量化金融中的人工智能12.2 量化因子投資的AI化組件&#xff1a;解剖學視角12.2.1 數據源拓展與預處理12.2.2 因子研究12.2.3 因子模型12.2.4…

【Golang】用官方rate包構造簡單IP限流器

文章目錄使用 Go 實現基于 IP 地址的限流機制什么是 IP 限流&#xff1f;基于 rate.Limiter 實現 IP 限流1. 設計思路2. 代碼實現3. 限流中間件4. 在 Gin 中使用中間件代碼解釋使用 Go 實現基于 IP 地址的限流機制 在高流量的服務中&#xff0c;限流是一個至關重要的環節。它不…

力扣 Pandas 挑戰(6)---數據合并

本文圍繞力扣的Pandas簡單題集&#xff0c;解析如何用Pandas完成基礎數據處理任務&#xff0c;適合Pandas初學者學習。題目1&#xff1a;1050. 合作過至少三次的演員和導演題目描述&#xff1a;ActorDirector 表&#xff1a;---------------------- | Column Name | Type | …

隨筆之TDengine基準測試示例

文章目錄一、基本信息二、基準測試策略三、基準測試過程1. 模擬高并發寫入場景2. 模擬并發查詢場景四、基準測試結論一、基本信息 TDengine 版本&#xff1a;3.3.6.13&#xff08;目前最新版本&#xff09;服務器配置&#xff1a;16核CPU&#xff0c;32GB內存&#xff0c;高IO…