C語言鏈接數據庫

目錄

使用 yum 配置 mysqld 環境

查看 mysqld 服務的版本

創建 mysql 句柄?

鏈接數據庫?

使用數據庫?

增加數據?

修改數據

?查詢數據

?獲取查詢結果的行數

?獲取查詢結果的列數?

獲取查詢結果的列名?

獲取查詢結果所有數據

斷開鏈接?

C語言訪問mysql數據庫整體源碼


????????通過前段時間的 mysql 數據庫的學習,我們知道了 mysql 數據庫本質上就是一個網絡服務,本期的主要內容在于講解如何使用 C 語言相關的接口連接 mysqld 網絡服務。

使用 yum 配置 mysqld 環境

? ? ? ? centos7 版本的操作系統使用一下指令安裝 mysqld 服務的配置文件。

sudo yum install mysql-devel

? ? ? ? 配置好之后,mysqld 相關的頭文件在 /usr/include/mysql 目錄下。我們連接 mysqld 服務時主要使用 mysql.h 頭文件。

? ? ? ? 配置好后。mysqld 對應的庫文件在 /usr/lib64/mysql 下。

? ? ? ? 在鏈接 mysqlclient 庫時,需要使用 -L 字段指明庫的路徑。?

g++ -o $@ $^ -std=c++11  -L/usr/lib64/mysql -lmysqlclient

查看 mysqld 服務的版本

  • 使用 mysql_get_client_info() 函數查看 mysqld 云服務版本。?
  std::cout<<"client version: "<<mysql_get_client_info()<<std::endl;

? ? ? ? 作者的版本是 mysql 5.7.44 版本。

創建 mysql 句柄?

  • 使用 mysql_init()?函數創建 mysql 句柄。
  MYSQL *my=mysql_init(nullptr);

鏈接數據庫?

  • 使用 mysql_real_connect() 函數鏈接數據庫。
#include<iostream>
#include<cstdio>
#include<mysql/mysql.h>const std::string host="127.0.0.1";
const std::string user="jd";
const std::string password="YJD010918madeinchina...";
const std::string db="study";
const unsigned int port=8088;int main()
{std::cout<<"client version: "<<mysql_get_client_info()<<std::endl;//1.創建mysql句柄MYSQL *my=mysql_init(nullptr);//2.鏈接數據庫if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0)==nullptr){std::cout<<"connect failed!"<<std::endl;return 1;}std::cout<<"connect success!"<<std::endl;
}

? ? ? ? 第一個參數為剛開始創建的 mysql 句柄,第二個參數為要訪問的 mysqld 的 ip,第三個參數為使用哪個 mysql 用戶訪問數據庫,?第四個參數為訪問數據庫的這個 mysql 用戶的密碼是多少,第四個參數為當前用戶訪問的數據庫的名稱,第五個參數為訪問的 mysqld 的端口號,后面兩個參數不需要了解。返回值為 MYSQL* 數據庫句柄類型,如果為空則連接數據庫失敗,如果不為空則鏈接數據庫成功。

使用數據庫?

? ? ? ? 數據庫的使用其實就是對數據庫表的使用,數據庫表的使用包含四個部分數據記錄的?增加,查詢,修改,刪除

? ? ? ? 無論是 增加,查詢,修改還是刪除,都使用下面的函數進行操作。

 int mysql_query(MYSQL *mysql, const char *q);

? ? ? ? 在對數據進行操作之前,我們應該先設置 mysql 句柄的編碼格式。

 //設置句柄的編碼格式mysql_set_character_set(my,"utf8");

增加數據?

? ? ? ? 向 study 數據庫中的 students 表中插入數據。

insert into students values (6,66,'張三','297599');

? ? ? ? 成功插入。?

修改數據

????????向 study 數據庫中的 students 表中修改數據。?

update from students set name='李四' where id =6;

? ? ? ? 成功修改。?

?查詢數據

? ? ? ? 查詢數據是數據操作中較為復雜的一個操作,因為涉及到了將數據查詢出來,并將數據顯示出來。查詢出來數據很簡單,但是復雜的是將查詢出來的數據顯示出來,如何顯示出來,我們需要使用 多個接口共同搭配使用將插敘出來的數據顯示出來。

? ? ? ? 查詢 students 表中的所有記錄。

select * from students;

? ? ? ? 使用下述函數讀取? mysql_query()??接口執行之后,mysql 句柄中查詢的結果。

MYSQL_RES *mysql_store_result(MYSQL *mysql);
     MYSQL_RES* res=mysql_store_result(my);

? ? ? ? 讀取的結果存儲在了 MYSQL_RES* 類型的返回值指向的特定結構體中。后續使用這個返回值獲取相關的結果字段。

?獲取查詢結果的行數

? ? ? ? 使用以下函數查詢行數。

 my_ulonglong mysql_num_rows(MYSQL_RES *res);
    //4.2獲取查詢的行數unsigned int rows = mysql_num_rows(res);std::cout << rows << std::endl;

? ? ? ? 查詢列數成功。?

?獲取查詢結果的列數?

? ? ? ? 使用以下函數查詢列數。

 unsigned int mysql_num_fields(MYSQL_RES *res);
    unsigned int fields = mysql_num_fields(res);std::cout << fields << std::endl;

? ? ? ? 查詢列數成功。

獲取查詢結果的列名?

? ? ? ? 使用以下函數查詢列名。

 MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res); 
//4.3獲取查詢記錄的每一列的列名稱MYSQL_FIELD* fields_name=mysql_fetch_field(res);for(int i=0;i<fields;i++){std::cout<<fields_name[i].name<<"\t";}std::cout<<std::endl;

? ? ? ? 查詢結果的列名稱獲取成功。

獲取查詢結果所有數據

? ? ? ? 1.先使用以下函數獲取查詢結果的所有行數據。

 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); 

? ? ? ? 可以將 MYSQL_ROW 看做一個二維數組。

for(int i=0;i<rows;i++){MYSQL_ROW lines=mysql_fetch_row(res);//line[i]表示第幾行的數據,直接獲取是無法獲取的,因為無法知道這一行數據的列數//就相當于如果只知道二維數組的行標不知道列表也是無法訪問二維數組的元素的}

? ? ? ? 2.通過列數,然后再訪問每行的每個元素,最終實現所有查詢結果的訪問。但是要注意,每列的元素都不應為空,否則會出現一些異常打印的問題。

? ? ? ? 基于此,對 students 中為空的字段進行修改。

 std::cout << std::endl;for (int i = 0; i < rows; i++){MYSQL_ROW lines = mysql_fetch_row(res);// line[i]表示第幾行的數據,直接獲取是無法獲取的,因為無法知道這一行數據的列數// 就相當于如果只知道二維數組的行標不知道列表也是無法訪問二維數組的元素的for (int j = 0; j < fields; j++){std::cout << lines[j] << "\t";}std::cout << std::endl;}

? ? ? ? 查詢結果的所有數據獲取成功。?

斷開鏈接?

? ? ? ? 使用以下函數斷開鏈接。

 void mysql_close(MYSQL *sock);
    free(res);mysql_close(my);

C語言訪問mysql數據庫整體源碼

#include <iostream>
#include <stdlib.h>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "jd";
const std::string password = "YJD010918madeinchina...";
const std::string db = "study";
const unsigned int port = 8088;int main()
{std::cout << "client version: " << mysql_get_client_info() << std::endl;// 1.創建mysql句柄MYSQL *my = mysql_init(nullptr);// 2.鏈接數據庫if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cout << "connect failed!" << std::endl;return 1;}// 3.設置鏈接的編碼格式mysql_set_character_set(my, "utf8");std::cout << "connect success!" << std::endl;// 4.進行數據庫表操作std::string sql = "select * from students";int code = mysql_query(my, sql.c_str());if (code != 0){std::cout << "execute: " << sql << "failed!" << std::endl;return 2;}std::cout << "execute: " << sql << " success!" << std::endl;// 4.1獲取查詢的結果到res中MYSQL_RES *res = mysql_store_result(my);// 4.2獲取查詢的行數int rows = mysql_num_rows(res);std::cout << rows << std::endl;int fields = mysql_num_fields(res);std::cout << fields << std::endl;// 4.3獲取查詢記錄的每一列的列名稱MYSQL_FIELD *fields_name = mysql_fetch_field(res);for (int i = 0; i < fields; i++){std::cout << fields_name[i].name << "\t";}// 4.4獲取查詢結果的每一行的數據std::cout << std::endl;for (int i = 0; i < rows; i++){MYSQL_ROW lines = mysql_fetch_row(res);// line[i]表示第幾行的數據,直接獲取是無法獲取的,因為無法知道這一行數據的列數// 就相當于如果只知道二維數組的行標不知道列表也是無法訪問二維數組的元素的for (int j = 0; j < fields; j++){std::cout << lines[j] << "\t";}std::cout << std::endl;}//5.斷開鏈接mysql_close(my);
}

? ? ? ? 至此,C語言鏈接數據庫的操作全部完成。

? ? ? ? 本期內容到此結束^_^

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

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

相關文章

【Maven】手動安裝依賴到本地倉庫

【Maven】手動安裝依賴到本地倉庫 【一】下載依賴【二】安裝 JAR 文件到本地倉庫【三】驗證安裝【四】在項目中使用該依賴【1】注意事項【2】額外提示 【一】下載依賴 登錄到中央倉庫下載依賴&#xff0c;中央倉庫地址&#xff1a;https://mvnrepository.com/ 搜搜你的依賴的a…

騰訊云golang一面

go垃圾回收機制 參考自&#xff1a;https://zhuanlan.zhihu.com/p/334999060 go 1.3 標記清除法 缺點 go 1.5 三色標記法 屏障機制 插入屏障 但是如果棧不添加,當全部三色標記掃描之后,棧上有可能依然存在白色對象被引用的情況(如上圖的對象9). 所以要對棧重新進行三色標記掃…

跨平臺嵌入式音視頻開發指南:EasyRTC音視頻通話的多場景適配與AI擴展能力

在數字化通信技術飛速發展的今天&#xff0c;實時音視頻通信已成為眾多智能設備和應用的核心功能。從智能家居到遠程辦公&#xff0c;從在線教育到智能安防&#xff0c;音視頻通信技術的應用場景不斷拓展&#xff0c;對低延遲、高穩定性和跨平臺兼容性的需求也在持續增長。在這…

Android 11 去掉性能受到影響通知

源碼位置: frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java final void finishBooting() {TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",Trace.TRACE_TAG_ACTIVITY_MANAGER);t.traceBegin("Finis…

Mac idea WordExcel等文件git modify 一直提示修改狀態

CRLF LF CR 換行符自動轉換問題 查看狀態&#xff1a;git config --global --list Mac需要開啟&#xff0c;window下需要關閉 關閉命令&#xff1a;git config --global core.autocrlf false 命令解釋&#xff1a; autocrlf true 表示要求git在提交時將crlf轉換為lf&a…

Apache Commons CLI 入門教程:輕松解析命令行參數

文章目錄 Apache Commons CLI 入門教程&#xff1a;輕松解析命令行參數一、什么是 Commons CLI&#xff1f;二、為什么選擇 Commons CLI&#xff1f;三、快速開始1. 添加依賴2. 基礎示例3. 運行示例1. 在Idea中運行2. 命令行中運行3. 使用 Maven/Gradle 運行&#xff08;推薦&a…

VS2022調試嵌入式linux C# 程序 高效的開發方案

1.目標板子配置好ssh,確保PC可以連上 2.目標板子上傳VSDBG程序&#xff0c;詳見我的上一個文章 3.PC安裝winfsp&#xff0c; sshfs,SSHFS-Win Manager.傻瓜式安裝&#xff0c;將目標板子映射到PC的某個盤 4.VS2022中&#xff0c;你的工程的exe生成目錄到上面盤中某個路徑 5…

Python中如何加密/解密敏感信息(如用戶密碼、token)

敏感信息,如用戶密碼、API密鑰、訪問令牌(token)、信用卡號以及其他個人身份信息(PII),構成了現代應用程序和系統中最為關鍵的部分。這些信息一旦被未經授權的第三方獲取,可能引發災難性的后果,從個人隱私泄露到企業經濟損失,甚至是大規模的社會安全問題。保護這些敏感…

智能體開發的范式革命:Cangjie Magic全景解讀與實踐思考

引言&#xff1a;當智能體開發遇見倉頡魔法 在人工智能技術日新月異的今天&#xff0c;智能體(Agent)開發正從實驗室走向產業應用的核心舞臺。2025年3月&#xff0c;倉頡社區推出的Cangjie Magic開源平臺&#xff0c;以其創新的設計理念和技術架構&#xff0c;為這一領域帶來了…

【Java學習筆記】位運算

位運算 一、原碼&#xff0c;反碼&#xff0c;補碼 (1) 二進制的最高位是符號位&#xff1a;0 表示正數&#xff0c;1 表示負數&#xff08;怎么記&#xff1f; 1旋轉一下變成-&#xff09; (2) 正數的原碼、反碼、補碼都一樣&#xff08;三碼合一&#xff09; (3) 負數的反碼…

HttpSessionBindingListener 的用法筆記250417

HttpSessionBindingListener 的用法筆記250417 HttpSessionBindingListener 是 Java Servlet 規范中 唯一 由 被存儲對象自身實現 的會話監聽接口&#xff0c; 1. 核心功能 HttpSessionBindingListener 是一個由 會話屬性對象自身實現 的接口&#xff0c;用于監聽該對象被綁定…

【HDFS入門】HDFS高可用性與容錯機制深度解析

目錄 引言 1 HDFS高可用架構實現 1.1 基于QJM的NameNode HA架構 1.2 QJM vs NFS實現對比 2 故障切換流程與ZooKeeper作用 2.1 自動故障轉移流程 2.2 狀態轉換機制 3 數據恢復與副本管理 3.1 DataNode故障處理流程 4 快照與數據保護機制 4.1 HDFS快照架構 4.2 快照使…

04-libVLC的視頻播放器:獲取媒體信息

libvlc_media_t* libvlc_media_player_get_media(libvlc_media_player_t* p_mi); 功能說明 核心作用:獲取與媒體播放器關聯的當前媒體對象返回值:成功:返回libvlc_media_t*指針失敗/無關聯媒體:返回NULL內存管理:返回的媒體對象引用計數會增加,需要使用libvlc_media_rele…

使用datax通過HbaseShell封裝writer和reader同步hbase數據到hbase_踩坑_細節總結---大數據之DataX工作筆記008

最近在做大數據相關功能,有個需求,使用datax同步hbase到hbase中,其中還是有很多細節值得記錄: 首先來看一下datax的源碼中,如果你使用phoenix創建的表,那么 你就需要使用對應的hbase帶有sql字樣的,reader和writer. 然后如果你使用datax-web來進行測試的,那么,他默認使用的是h…

如何通過window端來ssh連接本地虛擬機的ubuntu

首先在 Ubuntu 虛擬機上安裝和配置 SSH 服務&#xff1a; # 安裝 SSH 服務器 sudo apt update sudo apt install openssh-server# 檢查 SSH 服務狀態 sudo systemctl status ssh# 如果沒有啟動&#xff0c;則啟動 SSH 服務 sudo systemctl start ssh# 設置開機自啟動 sudo sys…

Anolis OS 8.10 發布:軟硬協同優化,滿足多行業實際應用需求

引言 龍蜥操作系統 Anolis OS 8 是 OpenAnolis 龍蜥社區發行的開源 Linux 發行版&#xff0c;支持多計算架構&#xff0c;提供穩定、高性能、安全、可靠的操作系統支持。Anolis OS 8.10 是 Anolis OS 8 發布的第六個小版本&#xff0c;通過軟硬協同&#xff0c;不斷完善生態&a…

Java八種常見的設計模式

一、單例模式 單例模式是&#xff08;Singleton Pattern&#xff09;Java中最常用的設計模式之一&#xff0c;它保證一個類僅有一個實例&#xff0c;并提供一個全局訪問點。 實現單例模式的核心是將類的構造方法私有化&#xff0c;以防止外部直接通過構造函數創建實例。同時&am…

4.17---實現商鋪和緩存與數據庫雙寫一致以及宕機處理

實現商鋪和緩存與數據庫雙寫一致&#xff08;以及強雙寫一致策略&#xff09; redis點評項目采用的是延時雙刪策略 雙刪&#xff1a; 我們更新完數據庫之后刪除緩存&#xff0c;這樣即使有線程并發進來查詢&#xff0c;會發現緩存中沒有數據&#xff0c;從而會去mysql中查找…

滑動窗口209. 長度最小的子數組

1.題目 給定一個含有 n 個正整數的數組和一個正整數 target 。 找出該數組中滿足其總和大于等于 target 的長度最小的 子數組 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其長度。如果不存在符合條件的子數組&#xff0c;返回 0 。 示例 1&#xff1a; 輸入&…

osu ai 論文筆記 DQN

e https://theses.liacs.nl/pdf/2019-2020-SteeJvander.pdf Creating an AI for the Rhytm Game osu! 20年的論文 用監督學習訓練移動模型100首歌能達到95準確率 點擊模型用DQN兩千首歌65準確率 V抖用的居然不是強化學習&#xff1f; 5,6星打96準確度還是有的東西的 這是5.…