sqlite 是乙個用c寫的超輕量級的開源資料庫;cppsqlite3 是對sqlite進行二次封裝後的c++類, 使用時需要依賴 sqlite3 庫及 sqlite3.h;
在 windows 環境下使用這個類的時候,你需要確保幾件事情:
cppsqlite3.h 和cppsqlite3.cpp
sqlite3.h、sqlite3.lib 和 sqlite3.dll (windows環境)
2. 工程中引入 sqlite3.lib,最後要將cppsqlite3.h 和cppsqlite3.cpp新增到工程中
// 製作 cppsqlite3 動態庫
#ifdef ***lib_exports
# define ***_api __declspec(dllexport)
#else
# define ***_api __declspec(dllimport)
#endif
新增匯出巨集 ***_api 及 [改進版]新增的 5 個函式
// cppsqlite3.h
//1. 類名前面增加匯出符號 ***_api
class
***_api cppsqlite3exception
class
***_api cppsqlite3buffer
class
***_api cppsqlite3binary
class
***_api cppsqlite3query
class
***_api cppsqlite3table
class
***_api cppsqlite3statement // 這個是預編譯,防注入用的
class
***_api cppsqlite3db
// 2. cppsqlite3db 類中增加 5 個函式
const
char
*get_errormsg()
;int
get_errorcode()
;unsigned
intop_begin
(const
char
*src_dbfile,
const
char
*asdb)
;unsigned
int(
const
char
*src_table,
const
char
*dst_table,
const
char
*key,
const
char
*asdb)
;unsigned
intop_end
(const
char
*asdb)
;// 下面是對應的函式實現, 在 cppsqlite3.cpp 中增加
const
char
* cppsqlite3db::
get_errormsg()
int cppsqlite3db::
get_errorcode()
//unsigned
int cppsqlite3db::
op_begin
(const
char
*src_dbfile,
const
char
*asdb)
ierror =
execdml
("begin transaction;");
return0;
}unsigned
int cppsqlite3db::
(const
char
*src_table,
const
char
*dst_table,
const
char
*key,
const
char
*asdb)
int ierror =0;
char sql[
512];if
(key)
sprintf_s
(sql,
sizeof
(sql)
,"insert into %s select a.* from %s.%s as a ;"
, dst_table, asdb, src_table)
; ierror =
execdml
(sql);if
(ierror <0)
return ierror;
}unsigned
int cppsqlite3db::
op_end
(const
char
*asdb)
return ierror;
}
sqlite在沒有顯式使用事務的時候會為每條 insert 都使用事務操作,而
sqlite資料庫是以檔案的形式存在磁碟中,就相當於每次訪問時都要開啟一次檔案,
如果對資料進行大量的操作,時間都耗費在i/o操作上,所以很慢。
解決方法:
顯式使用事務的形式提交, 因為我們開始事務後,進行的大量操作的語句都儲存在記憶體中,
當提交時才全部寫入資料庫,此時,資料庫檔案也就只用開啟一次。
錯誤處理方式:
//錯誤處理方式: 字串拼接, 當 %s 本身包含 ' 或是 " 或是 一些注入攻擊字串時, 會出錯.
cppsqlite3db bsdb;
bsdb.
open
(file)
;sprintf_s
(dstsql,
sizeof
(dstsql)
,"insert into task_total (taskid,gdsid,taskname,taskbrief,taskdetail,begintime,endtime) values (%llu,%u,'%s','%s','%s','%s','%s');"
,(uint64)row[0]
,(dword)row[1]
,(const
char
*)row[2]
,(const
char
*)row[3]
,(const
char
*)row[4]
,(const
char
*)row[5]
,(const
char
*)row[6]
;bsdb.
execdml
(dstsql)
;
正確處理方式:
//正確處理方式:借助 sqlite 的預編譯 compilestatement 方法
char dstsql[
1024]=
;sprintf_s
(dstsql,
sizeof
(dstsql)
,"insert into *** (col1,col2,col3....) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);");
cppsqlite3statement stmt = bsdb.
compilestatement
(dstsql)
;char srcsql[
1024]=
;sprintf_s
(srcsql,
sizeof
(srcsql)
,"select **** from **** where ****;");
mysqlpp::query query = sqlconn-
>m_conn-
>
query
(srcsql)
;mysqlpp::usequeryresult res = query.
use();
for(
;res;
)
參考
mysqlpp 封裝了c++對mysql操作
cppsqlite3 封裝了c++對sqlite操作
cppsqlite3statement引數繫結
sqlite 基礎教程 [事務]
sqlite 基礎教程 [附加]
sqlite 基礎教程 [分離]
Python之單引號 雙引號 三單引號 三雙引號
單引號和雙引號區別。三單引號和三雙引號也沒什麼區別。一 兩單引號之間不可以出現單引號,如果出現需要使用轉義字元 但可以出現雙引號 兩雙引號之間不可以出現雙引號,如果出現需要使用轉義字元 但可以出現單引號 兩三單雙引號沒什麼區別,三單引號 三雙引號 兩三單雙引號之間可以單雙引號都可以使用,但不可以出現...
Linux Shell 中的反引號,單引號,雙引號
反引號位 位於鍵盤的tab鍵的上方 1鍵的左方。注意與單引號 位於enter鍵的左方的區別。在linux中起著命令替換的作用。命令替換是指shell能夠將乙個命令的標準輸出插在乙個命令列中任何位置。如下,shell會執行反引號中的date命令,把結果插入到echo命令顯示的內容中。root loca...
Linux Shell 中的反引號,單引號,雙引號
反引號位 位於鍵盤的tab鍵的上方 1鍵的左方。注意與單引號 位於enter鍵的左方的區別。在linux中起著命令替換的作用。命令替換是指shell能夠將乙個命令的標準輸出插在乙個命令列中任何位置。如下,shell會執行反引號中的date命令,把結果插入到echo命令顯示的內容中。root loca...