国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

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

C++ Sqlite3的使用方法

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

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

|SQLite3簡介

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

SQL語句是SQL操作的指令,我們用C/C++訪問數據庫時,需要用char*即C字符串來保存SQL語句,然后調用相應sqlite3庫的函數,傳入C字符串,來執行SQL指令。

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

|SQL(structured query language)語句

特點:不區分大小寫,每條語句后加";"結尾。

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

數據定義語句(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;

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

  • 添加表中的數據 ? insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串內容用單引號。
?
1
INSERT INTO t_person (name, age) VALUES ('大明', 22);
  • 修改表中的數據 ? 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。
  • 刪除表中的數據 ? 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的記錄。

數據查詢語句(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;
  • 計算記錄條數: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 字段(默認升序);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 數值1,數值2;分頁查詢,數值1表示跳過前面多少條,數值2表示取出之后多少條。select * from 表名 limit 數值2;(跳過前面0條,相當于select * from 表名 limit 0,數值2,表示最前面多少條數據)
?
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(浮點型)、text(文本字符串)、blob(二進制數據)。

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

字段約束

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

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

  • 創建一個表:
?
1
CREATE TABLE IF NOT EXISTS t_class (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL UNIQUE);
  • 創建一個帶外鍵的表: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));
  • 利用外鍵來查詢多張表中的數據:
?
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; 
// 查詢所有學生對應的班級
 
   SELECT * FROM t_student WHERE class_id = (SELECT id FROM t_class WHERE name = '四班');
 // 查詢四班的所有學生

|C/C++上使用SQLite3

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

2、打開或者創建數據庫。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
sqlite3 *sql = NULL; // 一個打開的數據庫實例
 const char * path = "..../test.db";//某個sql文件的路徑
 
 // 根據文件路徑打開數據庫連接。如果數據庫不存在,則創建。
 // 數據庫文件的路徑必須以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 << "打開數據庫連接成功";
 }
 else {
 std::clog << "打開數據庫連接失敗";
 }

3、執行不返回數據的SQL語句(增、刪、改)。

  (執行更新、刪除語句和執行創表、添加語句基本類似,只需更改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語句句柄
 
 //進行插入前的準備工作——檢查語句合法性
 //-1代表系統會自動計算SQL語句的長度
 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);
 
 if (result == SQLITE_OK) {
 std::clog<< "添加數據語句OK";
 //執行該語句
 sqlite3_step(stmt);
 }
 else {
 std::clog << "添加數據語句有問題";
 }
 //清理語句句柄,準備執行下一個語句
 sqlite3_finalize(stmt);

4、執行返回數據的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語句句柄
 
 //進行查詢前的準備工作——檢查語句合法性
 //-1代表系統會自動計算SQL語句的長度
 int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);
 
 if (result == SQLITE_OK) {
 std::clog << "查詢語句OK";
 // 每調一次sqlite3_step()函數,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);
 //輸出相關查詢的數據
 std::clog << "name = " << name <<", age = "<< age;
 }
 }
 else {
 std::clog << "查詢語句有問題";
 }
 //清理語句句柄,準備執行下一個語句
 sqlite3_finalize(stmt);

5、關閉數據庫:sqlite3_close_v2(sqlite3* sql)

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

|SQLite3 庫函數 總結

1.打開數據庫

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

其中

flags參數有如下標志:

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

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

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

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

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

如果指令能查詢到下一行數據,就會返回SQLITE_ROW

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

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

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

//執行完查詢句柄后,stmt就會指向查到的數據

//然后可以通過stmt獲取相應數據

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

其他:

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

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

關閉數據庫連接

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

直接編譯并執行 SQL語句

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

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

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

SQLiteStudio是一個可視化的數據庫管理工具。

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

它是程序sqlite數據調試檢查不可或缺的輔助工具。

(界面大概如圖:)

C++ Sqlite3的使用方法

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

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

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

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

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

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

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

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

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

    spring-go5642021-07-02
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

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

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

    深入理解goto語句的替代實現方式分析

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

    C語言教程網7342020-12-03
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

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

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

    C/C++經典實例之模擬計算器示例代碼

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

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

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

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产精品一区二区三区四区 | 欧美日韩精品一区二区 | 性色国产 | 国产精品色一区二区三区 | 欧美在线高清 | 91亚洲精品一区 | 国产精品一区二区av | 四虎在线观看 | 麻豆激情 | 午夜伦理影院 | 欧美日韩国产一区二区三区 | 久色视频在线观看 | 99久久久久 | 色视频在线免费观看 | 亚州精品天堂中文字幕 | 亚洲精品一区久久久久久 | 亚洲欧美精选 | 日韩免费视频 | 国产免费黄色 | 久久精品久久久 | 一区二区三区不卡视频 | 国产一级大片 | 亚洲激情在线视频 | 久久久久久国产精品 | 亚洲综合区 | 欧美一区久久 | 日韩精品无码一区二区三区 | 国产在线资源 | 久久久美女 | 亚洲精品国产一区 | 在线中文字幕第一页 | 香蕉大人久久国产成人av | 黄色美女网站免费 | 婷婷五月情| 日韩在线精品视频 | 久久久久久国产精品免费免费狐狸 | 国产天堂| 亚洲欧美综合乱码精品成人网 | 欧美日韩一区二区中文字幕 | 免费久草 | 亚洲激情在线 |