華清遠見25072班網絡編程學習day6

重點內容:

數據庫基本概念:

????????數據(Data):能夠輸入計算機并能被計算機程序識別和處理的信息集合數據 (Database)

????????數據庫是在數據庫管理系統管理和控制之下,存放在存儲介質上的數據集合

重要概念:

????????記錄:能夠描述一條數據的完整信息稱為一個記錄(就是數據結構中的數據元素)

????????字段:描述數據中的最小不可再分割的單元(就是數據結構中的數據項)

SQLite的源代碼是C,其源代碼完全開放。SQLite第一個Alpha版本誕生于2000年5月。 他是一個輕量級的嵌入式數據庫。

SQLite有以下特性:

????????零配置 一 無需安裝和管理配置;

????????儲存在單一磁盤文件中的一個完整的數據庫;

????????數據庫文件可以在不同字節順序的機器間自由共享;

????????支持數據庫大小至2TB;

????????足夠小,全部源碼大致3萬行c代碼,250KB;

????????比目前流行的大多數數據庫對數據的操作要快;

sqlite3命令語句:

1. sqlite數據庫創建

? ? ? ? 1.sqlite3 xxx.db

? ? ? ? 2.sqlite3-->.open xxx.db

2. 系統命令,也稱為點命令????????

????????系統命令,需要以 . 開頭,不需要以 ; 結尾

????????????????.quit 退出數據庫

????????????????.exit 退出數據庫

????????????????.help 顯示幫助信息,獲取所有系統命令; ?

????????????????.table 查看當前數據庫下的所有表格;

????????????????.schema 查看表的結構

3. sql語句

1)創建表格

????????create table 表名 (字段名 數據類型, 字段名 數據類型);

????????create table if not exists 表名 (字段名 數據類型, 字段名 數據類型); ?

2)刪除表格

????????drop table 表名;

3)插入記錄

????????insert into 表名 values (數據1, 數據2, 數據3);-->全字段插入

????????insert into 表名 (字段名1, 字段名2) values (數據1, 數據2);-->部分字段插入

4)查看記錄

????????.header on 打開表頭

????????.mode column 對齊

????????select * from 表名;-->查看所有記錄

????????select * from 表名 where 限制條件;-->查看某幾行

????????select 字段1, 字段2 from 表名;-->查看某幾列

????????select 字段1, 字段2 from 表名 where 限制條件;-->查看某幾列

5)修改記錄

????????update 表名 set 字段=數值 where 限制條件; ?

6)刪除記錄

????????delete from 表名 where 限制條件; ?

7)主鍵(primary key)

????????create table 表名(字段名 數據類型 primary key, 字段名 數據類型 );

????????primary key主鍵:唯一標識表格中的每一條記錄;

8)拷貝

????????從a中拷貝所有數據到b中: create table b as select * from a;

????????從a中拷貝指定字段到b中: create table b as select 字段,字段,字段 from a; ?

9)增加列????????

????????alter table 表名 add column 字段名 數據類型;

10)修改表名

????????alter table 舊表名 rename to 新表名;

11)修改字段名(列名)

????????不支持直接修改列名

????????1.將表重新命名(a改成b) alter table stuinfo rename to stu;

????????2.新建修改名字后的表(新建一個a) create table stuinfo (name char, age1 int, sex char, score int);

????????3.從舊表b中取出數據,插入到新表a中; insert into stuinfo select * from stu;

12)刪除列

????????不支持直接刪除列;

????????1.創建一個新表b,并復制舊表a需要保留的字段信息; create table stu as select name, age1, sex from stuinfo;

???????? 2.刪除舊表a; drop table stuinfo;

????????3.修改新表b的名字a; alter table stu rename to stuinfo;

sqlite3 API:

1. sqlite3的C - APIs

1)sqlite3_open

????????int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ );

????????功能:打開一個數據庫,如果數據庫不存在,則創建一個數據庫并打開

????????參數1:要打開的數據庫的名字,是一個字符串

????????參數2:數據庫操作句柄,是一個二級指針,需要我們傳入一級指針的地址,如果打開數據庫成功,則數據庫指針由該參數返回

????????返回值:成功返回SQLITE_OK,失敗返回一個錯誤碼(非linux的錯誤碼),可以使用sqlite3_errmsg來獲取錯誤信息,由sqlite3_errcode返回錯誤碼值

????????注意:無論打開數據庫是否成功,在不使用數據庫時都應該使用sqlite3_close將其關閉

2)sqlite3_close

????????int sqlite3_close(sqlite3*);

????????功能:關閉數據庫,斷開句柄所擁有的資源

????????參數:數據庫指針

????????返回值:成功返回SQLITE_OK,失敗返回其他錯誤碼

3)sqlite3_errmsg

????????const char *sqlite3_errmsg(sqlite3*);

????????功能:通過出錯的句柄返回錯誤信息

????????參數:出錯的句柄

????????返回值:對應的錯誤信息,是一個字符串

4)sqlite3_errcode

????????int sqlite3_errcode(sqlite3 *db)

????????功能:通過錯誤句柄返回錯誤碼

????????參數:錯誤句柄

????????返回值:錯誤碼

5)sqlite3_exec

????????int sqlite3_exec( sqlite3* db, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *arg, /* 1st argument to callback */ char **errmsg /* Error msg written here */ );

????????功能:調用該函數,執行sql語句

????????參數1:已經被打開的數據庫句柄

????????參數2:要執行的sql語句

????????參數3:回調函數,主要用于數據庫查找時,處理查找的結果集的函數,如果不需要處理sql語句的結果,則填NULL即可

????????參數4:參數3的第一個參數

????????參數5:錯誤信息 返回值:成功返回SQLITE_OK,失敗返回其他錯誤碼

6)回調函數

????????int callback(void* arg,int cols, char** msgtext, char** msgheader)

????????功能:回調函數,對于sql語句執行后的每一個記錄行執行該回調函數

????????參數1:exec傳遞進來的參數

????????參數2:當前要處理的結果行的總列數

????????參數3:當前結果行信息的起始地址

????????參數4:當前結果行表頭的起始地址

????????返回值:成功返回0,失敗返回-1;

7)sqlite3_get_table

????????onst char *zSql, /* SQL to be evaluated */ char ***pazResult, /* Results of the query */ int *pnRow, /* Number of result rows written here */ int *pnColumn, /* Number of result columns written here */ char **pzErrmsg /* Error msg written here */ );
功能:通過執行sql語句,得到結果集中的內容

????????參數1:數據庫句柄

????????參數2:要執行的sql語句

????????參數3:查詢結果的起始地址,需要定義一個二級指針變量,將地址進行傳遞

????????參數4: 查詢結果的行數(不包括表頭)

????????參數5:查詢結果的列數

????????參數6:錯誤信息

????????返回值:成功返回SQLITE_OK,失敗返回非0的錯誤碼

8)sqltie3_free_table

????????void sqlite3_free_table(char **result);

????????功能:釋放表的空間

????????參數:通過sql語句查詢的結果


作業:

1> 實現一個XXX管理系統

程序源碼:

#include <25072head.h>
//定義添加學生信息函數
int do_add(sqlite3 *ppDb)
{
int add_id; ? ? ? ? ?//要添加的id號
char add_name[20]; ? //要添加的姓名
double add_score; ? ?//要添加的成績

? ? printf("請輸入要添加學生的學號:");
scanf("%d", &add_id);
printf("請輸入要添加學生的姓名:");
scanf("%s", add_name);
printf("請輸入要添加學生的成績:");
scanf("%lf", &add_score);
getchar();
//準備sql語句
char sql[128] = "";
sprintf(sql ,"insert into stuinfo values(%d, \"%s\",%.2lf);", \
add_id,add_name,add_score);
//執行sql語句
char *errmsg = NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("添加失敗:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("添加成功\n");
}
return 0;
}
int do_delete(sqlite3 *ppDb)
{
int delete_id; ? ? ? ? ? ? ? ? ? ? //要刪除的id號
printf("請輸入要刪除學生的學號"); ?
scanf("%d",&delete_id);
getchar();
//準備sql語句
char sql[128]="";
sprintf(sql,"delete from stuinfo where id=%d;",delete_id);
//執行sql語句
char *errmsg=NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("刪除失敗:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("刪除成功\n");
}
return 0;
}
int do_update(sqlite3 *ppDb)
{
int update_id; ? ? ? ? ?//要修改的id號
char update_name[20]; ? //要修改的姓名
double update_score; ? ?//要修改的成績
printf("請輸入要修改學生的學號:");
scanf("%d", &update_id);
printf("請輸入修改后的學生姓名:");
scanf("%s", update_name);
printf("請輸入修改后的學生成績:");
scanf("%lf", &update_score);
getchar();
//準備sql語句
char sql[128]="";
sprintf(sql,"update stuinfo set name=\"%s\",score=%.2lf where id=%d;",update_name,update_score,update_id);
//執行sql語句
char *errmsg=NULL;
if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("修改失敗:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
if(sqlite3_changes(ppDb) != 0)
{
printf("修改成功\n");
}
return 0;


}
//自定義查詢函數的回調函數
int callback(void *arg, int cols, char **msgtext, char **msgheader)
{
if( *(int *)arg ==0)
{
//先輸出表頭
for(int i=0; i<cols; i++)
{
printf("%s\t", msgheader[i]);
}
printf("\n");
*(int *)arg = 1;
}
//輸出內容
for(int i=0; i<cols; i++)
{
printf("%s\t", msgtext[i]);
}
printf("\n");
return 0;
}
//定義查找函數
int do_search(sqlite3 *ppDb)
{
//1.準備sql語句
char *sql = "select * from stuinfo;";
//2.執行sql語句
char *errmsg = NULL;
int flag = 0;
if(sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
{
printf("查詢失敗:%s\n", errmsg);
sqlite3_free(errmsg);
errmsg = NULL;
return -1;
}
printf("查詢成功\n");
return 0;
}
int main(int argc, const char *argv[])
{
//1,打開數據庫并返回一個操作該數據庫的句柄
sqlite3 * ppDb=NULL;
if(sqlite3_open("./my.db",&ppDb)!=SQLITE_OK)
{
printf("my.db open error errcode=%d,errmsg=%s\n",\
sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb));
return -1;
}
//程序執行至此,后期可以使用ppDb指針,進行數據庫操作了
//創建一個學生信息表
char *sql="create table if not exists stuinfo(id int primary key,\
name text not NULL,score double);";
//定義指針接收執行sql語句后的錯誤信息
char *errmsg=NULL;
if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
printf("創建數據表失敗:%s\n",errmsg);
sqlite3_free(errmsg);
errmsg=NULL;
return -1;
}
printf("學生信息表創建成功!\n");
int menu = -1;
while(1)
{
system("clear"); ? ? ? ? ? //執行系統終端指令
printf("\t\t==============XXX學生管理系統=============\n");
printf("\t\t==============1、增=======================\n");
printf("\t\t==============2、刪=======================\n");
printf("\t\t==============3、改=======================\n");
printf("\t\t==============4、查=======================\n");
printf("\t\t==============0、退出=======================\n");
printf("請輸入功能:");
scanf("%d", &menu);
getchar();
//多分支選擇
switch(menu)
{
case 1:
{
do_add(ppDb);
}
break;

? ? ? ? case 2:
{
do_delete(ppDb);
}
break;

? ? ? ? case 3:
{
do_update(ppDb);
}
break;
case 4:
{
do_search(ppDb);
}
break;
case 0: exit(EXIT_SUCCESS);
default:printf("輸入有錯,請重新輸入\n");
}
printf("按任意鍵后,按回車清屏\n");
while(getchar() != '\n');
}
//關閉數據庫
sqlite3_close(ppDb);
return 0;
}

2> 思維導圖

3> 牛客網

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

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

相關文章

機器學習-網絡架構搜索

Neural Architecture Search&#xff08;NAS&#xff09; 一個神經網絡有不同類型的超參數 拓撲結構&#xff1a;resnet&#xff0c;mobilenet 單獨層&#xff1a;核大小&#xff0c;卷積層的通道&#xff0c;輸出隱藏單元的個數NAS自動設計神經網絡 如何設計搜索空間 如何探索…

云手機在辦公領域中自動化的應用

云手機在辦公自動化領域正逐漸展現出強大的潛力&#xff0c;以下是其在辦公中自動化應用的多方面介紹&#xff1a;企業借助云手機搭載的辦公軟件&#xff0c;可實現文檔處理自動化&#xff0c;對于重復性文檔任務&#xff0c;如制作每月固定格式的銷售報告、財務報表等&#xf…

c++多線程(3)------休眠函數sleep_for和sleep_until

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 這兩個函數都定義在 頭文件中&#xff0c;屬于 std::this_thread 命名空間&#xff0c;用于讓當前線程暫停執行一段時間。函數功能sleep_for(rel_time)讓當前線程休眠一段相對時間&…

Intel RealSense D455深度相機驅動安裝與運行

Intel RealSense D455深度相機安裝過程遇到過一些報錯&#xff0c;所以記錄一下安裝過程&#xff01;&#xff01;&#xff01;以后方便回顧。 1.安裝最新的IntelRealSense SDK2.0 (1) 注冊服務器的公鑰 sudo apt-get update && sudo apt-get upgrade && su…

從異步到半同步:全面解讀MySQL復制的數據一致性保障方案

MySQL 主從復制&#xff08;Replication&#xff09;是其最核心的高可用性和擴展性功能之一。它的原理是將一個 MySQL 實例&#xff08;稱為主庫 Master&#xff09;的數據變更&#xff0c;自動同步到另一個或多個 MySQL 實例&#xff08;稱為從庫 Slave&#xff09;的過程。下…

PostgreSQL GIN 索引揭秘

文章目錄什么是GIN Index?示例場景GIN Index的原理GIN Index結構MetapageEntriesLeaf PagesEntry page 和 Leaf page 的關系Posting list 和posting tree待處理列表&#xff08;Pending List&#xff09;進階解讀GIN index索引結構總結什么是GIN Index? GIN (Generalized In…

開源多模態OpenFlamingo橫空出世,基于Flamingo架構實現圖像文本自由對話,重塑人機交互未來

注&#xff1a;此文章內容均節選自充電了么創始人&#xff0c;CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》&#xff08;跟我一起學人工智能&#xff09;【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

電子衍射模擬:基于GPU加速的MATLAB/Julia實現

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;電子衍射模擬的重要性與計算挑戰 電子…

easyExcel動態應用案例

代碼鏈接&#xff1a;https://download.csdn.net/download/ly1h1/919402991.案例說明&#xff1a;1.1.導入功能導入數據實現轉換成 List<List<String>> headers和 List<List<String>> datas&#xff0c;后續補充可以與數據模型注解結合&#xff0c;形…

【數據結構入門】排序算法(5):計數排序

目錄 1. 比較排序和非比較排序 2. 計數排序的原理 2.1 計數排序的弊端 3.代碼復現 3.1 代碼分析 3.2 排序核心 3.3 時間、空間復雜度 1. 比較排序和非比較排序 比較排序是根據排序元素的具體數值比較來進行排序&#xff1b;非比較排序則相反&#xff0c;非比較排序例如&…

輸入3.8V~32V 輸出2A 的DCDC降壓芯片SCT9320

同志們&#xff0c;今天來個降壓芯片SCT9320。輸入3.8V~32V&#xff0c;輸出最高可以達到2A。0.8V的參考電壓。500k的開關頻率。一共八個引腳&#xff0c;兩個NC&#xff08;為什么不做成六個引腳呢&#xff1f;&#xff09;。EN引腳懸空或者接到VIN都可以直接啟動&#xff0c;…

C++類和對象詳解(2);初識類的默認成員函數

1.類的默認成員函數默認成員函數就是用戶沒有顯示實現&#xff0c;編譯器會自動生成的成員函數稱為默認成員函數。一個類我們不寫的情況下編譯器會默認生成以下的6個默認成員函數。&#xff08;1&#xff09;構造函數&#xff1a;主要完成初始化的工作&#xff08;2&#xff09…

PLC通信 Tpc客戶端Socket

1.PLC通信 namespace _2.PLC通信 {public partial class Form1 : Form{public Form1(){InitializeComponent();}//連接//1.型號: 跟PLC溝通 使用哪個型號的PLC//2.IP 同上//3.機臺號:同上//4.插槽號:同上Plc plc new Plc(CpuType.S71200, "192.168.25.80", 0, 1);pr…

Android 開發實戰:從零到一集成 espeak-ng 實現中文離線 TTS(無需賬號開箱即用)

簡介 在移動應用開發中,語音合成(TTS)技術是提升用戶體驗的重要工具。然而,許多開發者在集成 TTS 時面臨依賴網絡、需注冊賬號、功能受限等問題。本文將帶你從零開始,通過開源項目 espeak-ng,實現無需賬號、開箱即用的中文離線語音播報。 文章將覆蓋以下核心內容: esp…

直播APP集成美顏SDK詳解:智能美妝功能的開發實戰

在這個“顏值即正義”的時代&#xff0c;用戶對直播APP的第一印象&#xff0c;往往來自主播的畫面質量。高清的視頻固然重要&#xff0c;但如果缺少自然美顏和智能美妝功能&#xff0c;觀眾體驗就會大打折扣。于是&#xff0c;美顏SDK成了直播行業的“標配”。今天&#xff0c;…

C++內存管理:new與delete的深層解析

1. 引言在C的世界里&#xff0c;動態內存管理是一個核心話題。對于從C語言過渡到C的開發者來說&#xff0c;一個常見的困惑是&#xff1a;既然C語言的malloc和free依然可以在C中使用&#xff0c;為什么C還要引入new和delete這兩個操作符&#xff1f;本文將深入探討這兩對內存管…

【AI開發】【前后端全棧】[特殊字符] AI 時代的快速開發思維

&#x1f680; AI 時代的快速開發思維 —— 以 Django Vue3 為例的前后端分離快捷開發流程 一、AI 時代的開發新思路 在 AI 的加持下&#xff0c;軟件開發不再是“純體力活”&#xff0c;而是 思維工具自動化 的協作。 過去&#xff1a;需求 → 設計 → 開發 → 測試 → 上…

Day24_【深度學習(3)—PyTorch使用—張量的創建和類型轉換】

一、創建張量1.張量基本創建方式torch.tensor 根據指定數據創建張量 &#xff08;最重要&#xff09;torch.Tensor 根據形狀創建張量, 其也可用來創建指定數據的張量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 創建指定類型的張量1.1 torch.tensor# 方式一&…

3-12〔OSCP ? 研記〕? WEB應用攻擊?利用XSS提權

鄭重聲明&#xff1a; 本文所有安全知識與技術&#xff0c;僅用于探討、研究及學習&#xff0c;嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任&#xff0c;本人不承擔任何責任。 如需轉載&#xff0c;請注明出處且不得用于商業盈利。 …

AI 大模型賦能智慧礦山:從政策到落地的全棧解決方案

礦山行業作為能源與工業原料的核心供給端&#xff0c;長期面臨 “安全生產壓力大、人工效率低、技術落地難” 等痛點。隨著 AI 大模型與工業互聯網技術的深度融合&#xff0c;智慧礦山已從 “政策引導” 邁入 “規模化落地” 階段。本文基于 AI 大模型智慧礦山行業解決方案&…