一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C/C++ - C++ Sqlite3的使用方法

C++ Sqlite3的使用方法

2021-09-10 13:05SolidMango C/C++

這篇文章主要介紹了C++ Sqlite3的使用方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

|SQLite3簡介

SQLite3只是一個輕型的嵌入式數(shù)據(jù)庫引擎,占用資源非常低,處理速度比Mysql還快,專門用于移動設(shè)備上進(jìn)行適量的數(shù)據(jù)存取,它只是一個文件,不需要服務(wù)器進(jìn)程。

SQL語句是SQL操作的指令,我們用C/C++訪問數(shù)據(jù)庫時,需要用char*即C字符串來保存SQL語句,然后調(diào)用相應(yīng)sqlite3庫的函數(shù),傳入C字符串,來執(zhí)行SQL指令。

常用術(shù)語:表(table)、字段(column,列,屬性)、記錄(row,record)。

|SQL(structured query language)語句

特點(diǎn):不區(qū)分大小寫,每條語句后加";"結(jié)尾。

關(guān)鍵字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,數(shù)據(jù)庫中不能使用關(guān)鍵字命名表和字段。

數(shù)據(jù)定義語句(DDL:Data Definition Language)

  • 新建表 ? create:create table 表名 (字段名1 字段類型1,字段名2 字段類型2,。。。); create table if not exists 表名 (字段名1 字段類型1,字段名2 字段類型2,。。。);
?
1
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);
  • 刪除表 ? drop:dorp table 表名;drop table if exists 表名;
?
1
DROP TABLE IF EXISTS t_person;

數(shù)據(jù)操作語句(DML:Data Manipulation language)

  • 添加表中的數(shù)據(jù) ? insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串內(nèi)容用單引號。
?
1
INSERT INTO t_person (name, age) VALUES ('大明', 22);
  • 修改表中的數(shù)據(jù) ? update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;
?
1
2
3
4
5
UPDATE t_person SET name = '小明', age = 10;
// 把表中name字段的值全部改成小明,age字段的值全部改成10。
 
UPDATE t_person SET age = 12 WHERE name = '小明';
// 把表中name字段值是小明的age值改為12。
  • 刪除表中的數(shù)據(jù) ? delete:delete from 表名;delete from 表名 where 字段 = 字段值。
?
1
2
3
4
5
6
7
8
DELETE FROM t_person;
// 刪除表中的所有記錄。
 
   DELETE FROM t_person WHERE age = 25;
 // 刪除表中字段age等于25的這條記錄。
 
   DELETE FROM t_person WHERE age > 12 AND age < 15;
 // 刪除表中年齡大于12且小于15的記錄。

數(shù)據(jù)查詢語句(DQL:Data Query Language)

  • select:select 字段1, 字段2, 。。。 from 表名;select 字段1, 字段2, 。。。 from 表名 where 字段 = 某值;select * from 表名;(查詢所有的字段)
  • 表別名:select 字段1 別名, 字段2 別名,。。。from 表名 別名;select 字段1 別名, 字段2 as 別名,。。。from 表名 as 別名;select 別名.字段1,別名.字段2,。。。from 表名 別名;
?
1
2
3
4
5
SELECT name, age FROM t_person WHERE age < 80;
 
   SELECT * FROM t_person WHERE age < 80;
 
   SELECT name, age nianling FROM t_person ren WHERE ren.age > 80 AND nianling < 90;
  • 計算記錄條數(shù):select count(字段或者*) from 表名;
?
1
2
3
SELECT count(name) FROM t_person ren WHERE ren.age > 80;
 
  SELECT count(*) FROM t_person ren WHERE ren.age > 80;
  • where:where 字段 = 某值;where 字段 is 某值;where 字段 != 某值;where 字段 is not 某值;where 字段 > 某值;where 字段1 = 某值1 and 字段2 < 某值2;where 字段1 = 某值1 or 字段2 > 某值2;
  • order by:select * from 表名 order by 字段(默認(rèn)升序);select * from 表名 order by 字段 desc(降序);select * from 表名 order by 字段 asc(升序);select * from 表名 order by 字段1 asc(先按字段1升序),字段2 desc(再按字段2降序);
?
1
2
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC;
// 先按年齡降序,再按名字升序。
  • limit:select * from 表名 limit 數(shù)值1,數(shù)值2;分頁查詢,數(shù)值1表示跳過前面多少條,數(shù)值2表示取出之后多少條。select * from 表名 limit 數(shù)值2;(跳過前面0條,相當(dāng)于select * from 表名 limit 0,數(shù)值2,表示最前面多少條數(shù)據(jù))
?
1
2
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC, name ASC LIMIT 3, 5;
// 先篩選,后排序,再分頁。
  • like:模糊查詢,select 字段1, 字段2, 。。。 from 表名 where 字段 like %某值%;
?
1
SELECT * FROM t_person WHERE name like '%明%';

存儲類型:integer(整型)、real(浮點(diǎn)型)、text(文本字符串)、blob(二進(jìn)制數(shù)據(jù))。

實際上SQLite是無類型的,建表時聲明的類型是為了方便程序員之間的交流,是一種良好的編程規(guī)范。

字段約束

  • not null:字段的值不能為空。
  • unique:字段的值必需唯一。
  • default:指定字段的默認(rèn)值。
  • primary key:主鍵,用來唯一的標(biāo)識某條記錄,相當(dāng)于記錄的身份證。主鍵可以是一個或多個字段,應(yīng)由計算機(jī)自動生成和管理。主鍵字段默認(rèn)包含了not null和unique兩個約束。
  • autoincrement:當(dāng)主鍵是integer類型時,應(yīng)該增加autoincrement約束,能實現(xiàn)主鍵值的自動增長。
?
1
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE, age integer NOT NULL DEFAULT 30);

外鍵:利用外鍵約束可以用來建立表與表之間的聯(lián)系,一般是一張表的某個字段,引用著另一張表的主鍵的字段。

  • 創(chuàng)建一個表:
?
1
CREATE TABLE IF NOT EXISTS t_class (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE);
  • 創(chuàng)建一個帶外鍵的表:t_student表中有一個叫做fk_student_class的外鍵,這個外鍵的作用是讓t_student表中的class_id字段引用t_class表中的id字段。
?
1
CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL, class_id integer NOT NULL, CONSTRAINT fk_student_class FOREIGN KEY (class_id) REFERENCES t_class(id));
  • 利用外鍵來查詢多張表中的數(shù)據(jù):
?
1
2
3
4
5
   SELECT t.name t_name, t.age t_age, tc.name c_name FROM t_student t, t_class tc WHERE t.class_id = tc.id; 
// 查詢所有學(xué)生對應(yīng)的班級
 
   SELECT * FROM t_student WHERE class_id = (SELECT id FROM t_class WHERE name = '四班');
 // 查詢四班的所有學(xué)生

|C/C++上使用SQLite3

1、配置好C/C++項目環(huán)境:導(dǎo)入sqlite3.lib和sqlite3.dll,包含頭文件#include <sqlite3.h>。(具體步驟此處不講,可參考該網(wǎng)頁)

2、打開或者創(chuàng)建數(shù)據(jù)庫。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
sqlite3 *sql = NULL; // 一個打開的數(shù)據(jù)庫實例
 const char * path = "..../test.db";//某個sql文件的路徑
 
 // 根據(jù)文件路徑打開數(shù)據(jù)庫連接。如果數(shù)據(jù)庫不存在,則創(chuàng)建。
 // 數(shù)據(jù)庫文件的路徑必須以C字符串傳入。
 int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL);
 
 if (result == SQLITE_OK) {
 std::clog << "打開數(shù)據(jù)庫連接成功";
 }
 else {
 std::clog << "打開數(shù)據(jù)庫連接失敗";
 }

3、執(zhí)行不返回數(shù)據(jù)的SQL語句(增、刪、改)。

  (執(zhí)行更新、刪除語句和執(zhí)行創(chuàng)表、添加語句基本類似,只需更改sql語句即可。)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const char *sqlSentence = "INSERT INTO t_person(name, age) VALUES('夏明', 22); "; //SQL語句
 sqlite3_stmt *stmt = NULL; //stmt語句句柄
 
 //進(jìn)行插入前的準(zhǔn)備工作——檢查語句合法性
 //-1代表系統(tǒng)會自動計算SQL語句的長度
 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);
 
 if (result == SQLITE_OK) {
 std::clog<< "添加數(shù)據(jù)語句OK";
 //執(zhí)行該語句
 sqlite3_step(stmt);
 }
 else {
 std::clog << "添加數(shù)據(jù)語句有問題";
 }
 //清理語句句柄,準(zhǔn)備執(zhí)行下一個語句
 sqlite3_finalize(stmt);

4、執(zhí)行返回數(shù)據(jù)的SQL語句(查)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const char *sqlSentence = "SELECT name, age FROM t_person WHERE age < 30;"; //SQL語句
 sqlite3_stmt *stmt = NULL; // stmt語句句柄
 
 //進(jìn)行查詢前的準(zhǔn)備工作——檢查語句合法性
 //-1代表系統(tǒng)會自動計算SQL語句的長度
 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);
 
 if (result == SQLITE_OK) {
 std::clog << "查詢語句OK";
 // 每調(diào)一次sqlite3_step()函數(shù),stmt語句句柄就會指向下一條記錄
 while (sqlite3_step(stmt) == SQLITE_ROW) {
 // 取出第0列字段的值
 const unsigned char *name = sqlite3_column_text(stmt, 0);
 // 取出第1列字段的值
 int age = sqlite3_column_int(stmt, 1);
 //輸出相關(guān)查詢的數(shù)據(jù)
 std::clog << "name = " << name <<", age = "<< age;
 }
 }
 else {
 std::clog << "查詢語句有問題";
 }
 //清理語句句柄,準(zhǔn)備執(zhí)行下一個語句
 sqlite3_finalize(stmt);

5、關(guān)閉數(shù)據(jù)庫:sqlite3_close_v2(sqlite3* sql)

?
1
2
3
4
if (sql) {
sqlite3_close_v2(sql);
sql = nullptr;
}

|SQLite3 庫函數(shù) 總結(jié)

1.打開數(shù)據(jù)庫

?
1
2
3
4
5
6
int sqlite3_open_v2(
const char *filename,   // 數(shù)據(jù)庫的文件路徑
sqlite3 **ppDb,       // 數(shù)據(jù)庫實例
int flags,          // 標(biāo)志
const char *zVfs      // 使用該數(shù)據(jù)庫的虛擬機(jī)的名字,這里我們不需要用,直接NULL
);

其中

flags參數(shù)有如下標(biāo)志:

?
1
2
3
4
5
6
SQLITE_OPEN_NOMUTEX: 設(shè)置數(shù)據(jù)庫連接運(yùn)行在多線程模式(沒有指定單線程模式的情況下)
SQLITE_OPEN_FULLMUTEX:設(shè)置數(shù)據(jù)庫連接運(yùn)行在串行模式。
SQLITE_OPEN_SHAREDCACHE:設(shè)置運(yùn)行在共享緩存模式。
SQLITE_OPEN_PRIVATECACHE:設(shè)置運(yùn)行在非共享緩存模式。
SQLITE_OPEN_READWRITE:指定數(shù)據(jù)庫連接可以讀寫。
SQLITE_OPEN_CREATE:如果數(shù)據(jù)庫不存在,則創(chuàng)建。

2.檢查SQL語句的合法性(查詢前的準(zhǔn)備)

若語句合法即編譯通過,則將語句產(chǎn)生的指令塞進(jìn)stmt句柄(此時并未執(zhí)行指令)

?
1
2
3
4
5
6
7
int sqlite3_prepare_v2(
 sqlite3 *db,  // 數(shù)據(jù)庫實例
 const char *zSql, // 需要檢查的SQL語句
 int nByte,  // SQL語句的最大字節(jié)長度
 sqlite3_stmt **ppStmt, // stmt句柄,用來存儲SQL stmt指令
 const char **pzTail
);

3.執(zhí)行stmt句柄(執(zhí)行存儲在stmt句柄的指令)

如果指令能查詢到下一行數(shù)據(jù),就會返回SQLITE_ROW

如果指令(例如寫入數(shù)據(jù))不需要返還數(shù)據(jù),就會返還SQLITE_DONE

?
1
2
3
int sqlite3_step(
  sqlite3_stmt* stmt   //stmt句柄
 );

4.利用stmt句柄獲得第iCol字段的值(字段的下標(biāo)從0開始)

//執(zhí)行完查詢句柄后,stmt就會指向查到的數(shù)據(jù)

//然后可以通過stmt獲取相應(yīng)數(shù)據(jù)

?
1
2
3
4
5
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮點(diǎn)數(shù)據(jù)
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型數(shù)據(jù)
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 長整型數(shù)據(jù)
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二進(jìn)制文本數(shù)據(jù)
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串?dāng)?shù)據(jù)

其他:

清理語句句柄(以便重復(fù)使用同一個stmt句柄)

?
1
2
3
int sqlite3_finalize(
  sqlite_stmt* stmt      //stmt句柄
);

關(guān)閉數(shù)據(jù)庫連接

?
1
2
3
int sqlite3_close_v2(
  sqlite3 * sql, // 數(shù)據(jù)庫實例
);

直接編譯并執(zhí)行 SQL語句

(不推薦使用:1、沒有SQL語法檢查 2、每一句SQL語句即使完全一樣,也會重新編譯執(zhí)行,對批量指令來說效率不高。)

?
1
2
3
4
5
6
7
int sqlite3_exec(
 sqlite3* sql, // 一個打開的數(shù)據(jù)庫實例
 const char * sqlSentence, // 需要執(zhí)行的SQL語句
 int (*callback)(void*,int,char**,char**), // SQL語句執(zhí)行完畢后的回調(diào)
 void *,  // 回調(diào)函數(shù)的第1個參數(shù)
 char **errmsg // 錯誤信息
);

|額外:使用SQLiteStudio工具來輔佐

SQLiteStudio是一個可視化的數(shù)據(jù)庫管理工具。

通過可視化界面,它可以方便快捷地查看或操作數(shù)據(jù)庫信息。

它是程序sqlite數(shù)據(jù)調(diào)試檢查不可或缺的輔助工具。

(界面大概如圖:)

C++ Sqlite3的使用方法

原文鏈接:https://www.cnblogs.com/pugang/p/12848974.html以上就是C++ Sqlite3的使用方法的詳細(xì)內(nèi)容,更多關(guān)于C++ Sqlite3的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

延伸 · 閱讀

精彩推薦
  • C/C++學(xué)習(xí)C++編程的必備軟件

    學(xué)習(xí)C++編程的必備軟件

    本文給大家分享的是作者在學(xué)習(xí)使用C++進(jìn)行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    strcpy 和strcnpy函數(shù)是字符串復(fù)制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現(xiàn)同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下...

    C語言教程網(wǎng)7342020-12-03
  • C/C++C語言實現(xiàn)電腦關(guān)機(jī)程序

    C語言實現(xiàn)電腦關(guān)機(jī)程序

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C/C++經(jīng)典實例之模擬計算器示例代碼

    C/C++經(jīng)典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實例之模擬計算器的相關(guān)資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內(nèi)存中的數(shù)據(jù)都是暫時的,當(dāng)程序結(jié)束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 成人免费草草视频 | 国产成年人在线观看 | 扒开双腿羞辱调教play视频 | 欧美四级无删版影片 | 美国69xxxx59 | 男gay男gay男gay野外 | 男人天堂资源网 | 日本免费全黄一级裸片视频 | 免费观看日本人成影片 | 5555kkkk香蕉在线观看 | 国产亚洲sss在线播放 | ipx-177绝对领域在线观看 | 久久精品123| 国产日产欧产精品精品软件 | 明星裸乳照无奶罩 | 色婷婷影院在线视频免费播放 | 精品国产三级av在线 | 国产精品福利短视在线播放频 | 日本一区二区视频在线 | chinese国产人妖hd | 国产精品成人免费 | 国产一卡2卡3卡四卡国色天香 | videos护士有奶水 | 日本美女动态图片 | 美女脱了内裤打开腿让男人图片 | 高清欧美videossexo免费 | 免费标准高清看机机桶机机 | h片免费网站 | 青草久久伊人 | 羞羞影院午夜男女爽爽影院网站 | 女人是男人的未来1分49分 | 22sihu国产精品视频影视资讯 | 久久99热狠狠色AV蜜臀 | 日韩一区二区三区不卡视频 | 91青青在线视频 | 95视频免费看片 | 精品国产免费第一区二区三区日韩 | 国产探花视频在线观看 | 喜欢老头吃我奶躁我的动图 | 嫩草影院永久入口在线观看 | 免费黄色小说 |