sqlite的C/C++ API介面的基礎操作與事務
一、C/C++ 介面 API
主要通過通過sqlite3_open,sqlite3_exec和qlite3_close來實現一個簡單的資料庫操作。
1.1、sqlite3_open
sqlite3_open(const char *filename, sqlite3 **ppDb)
- 開啟一個指向 SQLite 資料庫檔案的連線,返回一個用於其他 SQLite 程式的資料庫連線物件
filename
引數是NULL
或':memory:'
,sqlite3_open()
將會在 RAM 中建立一個記憶體資料庫,這隻會在 session 的有效時間內持續filename
不為NULL
,sqlite3_open()
sqlite3_open()
將建立一個新的命名為該名稱的資料庫檔案並開啟
1.2、sqlite3_exec
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
- 提供了一個執行 SQL 命令的快捷方式,SQL 命令由
sql
引數提供,可以由多個 SQL 命令組成 - 第一個引數
sqlite3
是開啟的資料庫物件,sqlite_callback
是一個回撥data
作為其第一個引數errmsg
將被返回用來獲取程式生成的任何錯誤 sqlite3_exec()
程式解析並執行由sql
引數所給的每個命令,直到字串結束或者遇到錯誤為止
1.3、sqlite3_close
sqlite3_close(sqlite3*)
- 關閉之前呼叫
sqlite3_open()
開啟的資料庫連線。所有與連線相關的語句都應在連線關閉之前完成。如果還有查詢沒有完成,sqlite3_close()
將返回SQLITE_BUSY
禁止關閉的錯誤訊息
1.4、插入例程
void jobSerialInsertSQL(struct S_SERIAL_JOB serialjob)
{
char* insertJob;
char sql[255 ];
sqlite3 *db;
int rc;
char *zErrMsg = 0;
rc = sqlite3_open("jp.db",&db);
if(rc)
{
printf("Can not open database:%s\n",sqlite3_errmsg(db));
return;
}
insertJob = "INSERT INTO rt_jobserial (task_serial,task_id,point_tag,device_tag) VALUES (";
sprintf(sql,"%s%d%s%d%s%d%s%d%s",
insertJob,
serialjob.task_serial,
",",
serialjob.task_id,
",",
serialjob.point_tag,
",",
serialjob.device_tag,
")");
rc = sqlite3_exec(db,sql,sqliteCallback,0,&zErrMsg);
if( rc != SQLITE_OK)
{
printf("SQL ERROR: %s\n",zErrMsg);
sqlite3_free(zErrMsg);
}
else{}
sqlite3_close(db);
}
經過測試,上面程式碼在for迴圈執行插入1500條資料大約耗時1~2分鐘,效率很低,在工程中是無法滿足需求的。
預設SQLite的資料庫插入操作,如果沒有采用事務的話,它每次寫入提交,就會觸發一次事務操作,而這樣幾千條的資料,就會觸發幾千個事務的操作,這就是時間耗費的根源。
二、事務實現
2.1、什麼是事務?
事務是使用者定義的一些列資料操作,這些操作是一個完整的不可分的工作單元。一個事務要麼全部執行,要麼全部不執行。
2.2、事務屬性(ACID)
原子性(Atomicity): 確保工作單位內的所有操作都成功完成,否則,事務會在出現故障時終止,之前的操作也會回滾到以前的狀態。
一致性(Consistency):確保資料庫在成功提交的事務上正確地改變狀態。
隔離性(solation): 使事務操作相互獨立和透明。
永續性(Durability): 確保已提交事務的結果或效果在系統發生故障的情況下仍然存在。
2.3、事務控制
事務控制命令只與 DML 命令 INSERT
、UPDATE
和DELETE
一起使用。他們不能在建立表或刪除表時使用,因為這些操作在資料庫中是自動提交的。
BEGIN TRANSACTION
:開始事務處理。COMMIT
:儲存更改,或者可以使用 END TRANSACTION 命令。ROLLBACK
:回滾所做的更改。
2.4、事務例程
void jobSerialInsertSQL(struct S_SERIAL_JOB *serialjob,int totalNum)
{
char* insertJob;
char sql[255];
sqlite3 *db;
int rc;
char *zErrMsg = 0;
int i = 0;
bool isExecSuccess = true;
rc = sqlite3_open("jp.db",&db);
if(rc)
{
printf("Can not open database:%s\n",sqlite3_errmsg(db));
return;
}
sqlite3_exec(db, "begin;", 0, 0, &zErrMsg); //開啟事務
insertJob = "INSERT INTO rt_jobserial (task_serial,task_id,point_tag,device_tag) VALUES (";
for(i=0;i<totalNum;i++)
{
sprintf(sql,"%s%d%s%d%s%d%s%d%s",
insertJob,
serialjob[i].task_serial,
",",
serialjob[i].task_id,
",",
serialjob[i].point_tag,
",",
serialjob[i].device_tag,
")");
rc = sqlite3_exec(db,sql,sqliteCallback,0,&zErrMsg);
memset(sql,0,255);
if( rc != SQLITE_OK)
{
isExecSuccess = false;
printf("SQL ERROR: %s\n",zErrMsg);
sqlite3_free(zErrMsg);
}
else{}
}
if(isExecSuccess)
{
sqlite3_exec(db, "commit;", 0, 0, 0);
}
else
{
sqlite3_exec(db, "rollback;", 0, 0, 0);
}
sqlite3_close(db);
}
經過測試,上面程式碼插入1500條資料所需時間約為 70~90 ms。
相關推薦
sqlite的C/C++ API介面的基礎操作與事務
一、C/C++ 介面 API 主要通過通過sqlite3_open,sqlite3_exec和qlite3_close來實現一個簡單的資料庫操作。 1.1、sqlite3_open sqlite3_open(const char *filename, sqlit
Elasticsearch基礎操作與對應的curl命令列,python對接實現
前言 Elasticsearch 實際上提供了一系列 Restful API 來進行存取和查詢操作,我們可以使用 curl 等命令來進行操作,但畢竟命令列模式沒那麼方便,所以這裡我們在介紹操作對應curl命令同時也如何利用 Python 來對接 Elasticsearch 實現同樣的
C++中string基礎操作
1. 擷取子串 s.substr(pos, n) 擷取s中從pos開始(包括0)的n個字元的子串,並返回 s.substr(pos)  
MySQL 資料操作與事務控制
-- 課後作業 -- 1.使用如下語句,建立學生表student和班級表class create table student ( -- 學生表 xh char(4), -- 學號 xm va
sqlite之我見--C/C++ API介面示例 .
在之前的兩篇博文中,分別介紹了SQLITE的基礎知識和操作,C/C++ 的一些常用API 本文中,我會給大家用幾個小程式示例SQLITE C/C++ API的使用。 1.我們看下最簡單的sqlite程式,通過sqlite3_open, sqlite3_exec, sq
[C++]關於介面的設計與宣告--對封裝性的理解
設計與宣告 所謂軟體設計,是“令軟體做出你希望它做的事情”的步驟和方法,通常以頗為一般性的構想開始,最終十足的細節,以允許特殊介面(interface)的開發。這些介面而後必須轉換為C++宣告式。本文討論對良好C++介面的設計和宣告。 1. 讓介
使用python3和flask構建RESTful API(介面測試服務與mockserver工具)
引言 構建RESTful API貌似是開發的工作,和測試有和關係? 其實測試開發需要構建RESTful API的場景很多。比如測試Android應用,一般的介面測試只考慮了伺服器端,至於客戶端在網路異常或者服務端異常時如何反應,多數天朝的測試人員是沒有考慮到的。客戶端在對
C# 多執行緒操作介面時,使用Invoke與BeginInvoke的區別
Invoke方法的引數很簡單,一個委託,一個引數表(可選),而Invoke方法的主要功能就是幫助你在 UI執行緒(即建立控制元件的執行緒)上呼叫委託所指定的方法。Invoke方法首先檢查發出呼叫的執行緒(即當前執行緒)是不是UI執行緒,如果是,直接執行委託指向 的方法
Lua:模組、使用位操作BitOp、C API(Lua與C互相呼叫)
一、模組 1.1 概述 建立一個模組最簡單的方法是: 1. 建立一個table; 2. 並將所有需要匯出的函式放入其中; 3. 最後返回這個table。 1.2 程式碼 檔案:test.lua complex = {} f
虛擬機與ubuntu系統的安裝與基礎操作
ubun 回車 border 多個 管理 ssh 虛擬機安裝 swd kylin 1.虛擬機的下載: 常見的虛擬機軟件有:VMware VirtuaIBOX Virtual PC 等。 這裏主要介紹VMware ,VMware目前已經有很多個版本,可以根據
Linux下C/C++的文件操作open、fopen與freopen
open fopen freopen open是linux下的底層系統調用函數,fopen與freopen c/c++下的標準I/O庫函數,帶輸入/輸出緩沖。linxu下的fopen是open的封裝函數,fopen最終還是要調用底層的系統調用open。所以在linux下如果需要對設備進行明確的控制
C語言基礎--決策與判斷
出現 program 程序 c語言基礎 res else if express 基礎 裏的 需要掌握的內容: 一. 1.if語句 C語言提供一種稱為if語句的語法格式,通用的形式是: if(express) { programming statements; }
zookeeper的c API 單線程與多線程問題 cli_st和cli_mt
.lib libs tool .com tag gnu 編譯選項 watch || 同樣的程序,在centos和ubuntu上都沒有問題,在solaris上問題卻多多,據說是solaris管理更加嚴格。 zookeeper_init方法,在傳入一個錯誤的host也能初始
內存布局------c++程序設計基礎、編程抽象與算法策略
棧幀 如何 post 內存 class 靜態區 內存區域 ati ima 圖中給出了在一個典型c++程序中如何組織內存的框架。程序中的指令(在底層都是按位存儲的)和全局變量往往被存儲在靜態去(static area),該區域位於地址編址號較小的接近機器地址空間的開始處
聲明函數指針------c++程序設計基礎、編程抽象與算法策略
space pos brush 技術分享 c++ info 程序 std mes #include<iostream> using namespace std; double a(double aa) { return aa; } int main() {
c++11 原子類型與原子操作
thread_local automic quick_exit 1、原子類型和原子操作(1)類型(2)操作(3)詳述● 原子類型只能從其模板參數類型中進行構造,標準不允許原子類型進行拷貝構造、移動構造,以及使用operator=等● atomic_flag 是一個原子的布爾類型,無鎖的,即線程對其
Redis(三)Redis基本命令操作與API
最新 integer 朋友圈 shm ica 有序集合 object prop hashmap 一Redis 連接 Redis 連接命令主要是用於連接 redis 服務。 實例 以下實例演示了客戶端如何通過密碼驗證連接到 redis 服務,並檢測服務是否在運行: r
C++開發EOS基礎指南之類與結構
namespace pri 銷毀 默認構造函數 cti 對象 成員函數 初始化 析構 C++是一種面向對象的編程語言。它有一個強大的繼承系統,私有和公共成員變量,以及通過成員初始化列表在構造函數中初始化它們的好方法。析構函數是構造函數的附件,允許你在對象被銷毀或超出範圍時運
C語言檔案操作與Python檔案操作的比較
無論是在C語言中還是在Python中,對檔案的操作都是直接實現了計算機內部與外部之間的互動; 通過將資料寫入檔案可以更好地實現資料的儲存,而不會在程式結束之後資料隨之消失, 而通過檔案的讀取操作則可以更好地避免自己講大量資料的手動輸入程式。 本篇文章主要介紹C語言以
重灌ubuntu16.04之後的基礎操作(介面美觀+安裝瀏覽器+更新軟體源+安裝ROS)
1.介面美觀 1.安裝 Numix 主題和圖示 sudo apt-get install unity-tweak-tool sudo add-apt-repository ppa:numix/ppa sudo apt-get update 2.安裝Unity Tweak T