sqlite3 c/c++ 介面:
sqlite3 介面的核心元素
兩個物件
八大函式
兩個物件:
sqlite3 :the database connection object 資料庫連線物件
資料庫連線控制代碼/資料庫檔案描述符
sqlite3 代表著你所開啟的那個sqlite3的資料庫檔案,後序對這個資料庫檔案
進行操作都需要用到這個物件
sqlite3_stmt :the prepared statemet object sql語句物件
八大函式:
sqlite3_open :開啟或建立乙個sqlite3資料庫,返回乙個sqlite3資料庫連線物件
sqlite3_close :關閉乙個sqlite3資料庫
sqlite3_prepare_v2 :建立乙個sql語句物件
sqlite3_bind_* :給語句物件繫結引數的函式
sqlite3_step :執行sql語句物件
sqlite3_column :分析一行中的列
sqlite3_reset :用來復位sql語句物件,以便下一輪的引數繫結
sqlite3_finalize:銷毀乙個語句物件
sqlite3_exec:
sqlite3_prepare_v2
sqlite3_step
sqlite3_finalize
三個函式的合成
具體的api函式解析
(1)開啟乙個sqlite3資料庫
在sqlite3資料庫管理系統中,用結構體 sqlite3來表示乙個已經開啟的資料庫物件
int sqlite3_open( const char *filename, sqlite3 **ppdb);
filename:要開啟的資料庫的路徑名
ppdb:二級指標,用來儲存開啟的資料庫連線物件
返回值:
成功返回 sqlite_ok
失敗返回其他值
(2) 關閉乙個sqlite3資料庫
int sqlite3_close(sqlite3*ppdb);
ppdb:要關閉的資料庫連線物件
返回值:
成功返回 sqlite_ok
失敗返回其他值
(3)sql語句物件
用sqlite3_stmt結構體來描述乙個sql語句物件
我們的應用都是通過 sql語句物件 把 sql語句指令發給資料庫管理系統
sqlite3_prepare_v2 :建立乙個sql語句物件
int sqlite3_prepare_v2(
sqlite3 *db, /* 資料庫連線物件,表示要操作哪個資料庫 */
const char *zsql, /* 要執行的sql語句,多條sql語句用 ; 隔開,可以包含變數名 */
int nbyte, /* 表示要編譯到哪個位置 */
< 0 :編譯到zsql指向的語句中第乙個\0為止
== 0 :什麼都不編譯
>0 : 只編譯 zsql指向的語句中的前n個位元組
sqlite3_stmt **ppstmt, /* *ppstmt 用來儲存編譯好的sql語句物件 */
const char **pztail /* 如果不為空 ,*pztail 指向的zsql中編譯的第一條完整的
sql語句的第乙個字元的位址*/
);
返回值:
成功返回 sqlite_ok
失敗返回其他值
zsql指向的sql語句:
(1)不帶引數
const char * sql = "create table t_stu\
(\num int primary key,\
name varchar(255) not null,\
age int\
);insert into t_stu(num,name,age) values (1001,'pxl',\
18);";
(2)帶引數
編譯的sql語句中可以包含 「變數/引數」,其值在執行期間可以改變,但是
sql語句物件不需要重新編譯,通過特定的採納數介面來指定這些sql變數的值
const char*sql = "insert into t_stu(num,name,age) values (變數名1,變數名2,變數名3));";
變數名按照以下方式來執行:
?num num 的範圍[1,max_num]
eg:const char*sql = "insert into t_stu(num,name,age) values (?1,?2,?3));";
:nmae name 就是你取的變數的名字
@name
$name
eg:const char*sql = "insert into t_stu(num,name,age) values (:a,:b,:c));";
(2.1)給sql語句物件中的引數賦值
1. 獲取引數的索引
因為所有的繫結引數的函式,都是通過索引去操作這些引數
sqlite3_bind_parameter_index :用來獲取某個變數在sql語句物件中的索引
int sqlite3_bind_parameter_index(sqlite3_stmt*stmt, const char *zname);
stmt:sql語句物件
zname:變數名
返回值:成功返回索引 (> 0)
假如沒有匹配到引數名 返回0
2. 繫結相應的值到變數/引數上面
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*stmt,int index,const char*str,int,void(*)(void*));
第乙個引數:sql語句物件
第二個引數: 要繫結的變數的索引
第三個引數: 要繫結的值
sqlite3_bind_int==》int
sqlite3_bind_double ==》double
sqlite3_bind_null ==>空
int sqlite3_bind_text(sqlite3_stmt*stmt,int index,const char*str,int len,void(*p)(void*));
str :要繫結的字串的位址
len :字串的長度
p : 函式指標,指向的函式用來釋放字串的空間
如果不需要釋放字串的空間 直接給 null
(4)sqlite3_step :執行sql語句物件
int sqlite3_step(sqlite3_stmt*pstmt);
pstmt : 指向要編譯好的並且要執行的sql語句物件
返回值:
sqlite_done :sql語句執行完成
sqlite_error :出錯啦
sqlite_busy :沒有拿到鎖,沒有執行語句
sqlite_misuse:使用方法不當
sqlite_row:返回一行
當sql語句時select時候,執行結果是乙個結果集,一行一行的返回。
呼叫一次sqlite3_step就可以獲取一行的結果,一直呼叫到結果為done
sqlite_row:返回一行,需要使用者自己呼叫解析函式去解析這一行的資料
//用來獲取一行中有多少列
int sqlite3_column_count(sqlite3_stmt *pstmt);
//用來獲取一行中第i列的資料型別
int sqlite3_column_type(sqlite3_stmt*pstmt, int icol);
pstmt:sql語句物件
icol :第幾列 ,從 0開始
返回值:
sqlite_integer 1
sqlite_float 2
sqlite_blob 4
sqlite_null 5
sqlite_text 3
// 獲取一行中第i列的值
const void *sqlite3_column_blob(sqlite3_stmt*, int icol);
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 unsigned char *sqlite3_column_text(sqlite3_stmt*, int icol);
//獲取第i列的列名
const char *sqlite3_column_name(sqlite3_stmt*, int n);
(5) sqlite3_finalize:銷毀乙個語句物件
int sqlite3_finalize(sqlite3_stmt *pstmt);
pstmt:要銷毀的語句物件
(6) sqlite3_reset :重置sql語句物件,以便下一輪繫結引數
int sqlite3_reset(sqlite3_stmt *pstmt);
pstmt:要重置的語句物件
(7) sqlite3_errmsg :輸出資料庫中的出錯資訊
const charsqlite3_errmsg(sqlite3pdb);
資料庫 SQLite3常用函式
開啟資料庫 函式原型 int sqlite3 open const char filename,sqlite3 ppdb 函式功能 開啟乙個資料庫,若該資料庫檔案不存在,則自動建立。開啟或者建立資料庫的命令會被快取,直到這個資料庫真正被呼叫的時候才會被執行。輸入引數 filename,待開啟的資料庫...
SQLite資料庫掃盲
今天注意到 sqlite 3.6.11 上個月發布的 增加了乙個我期待已久的 online backup 介面,激動之餘就順便和大夥兒聊一下sqlite資料庫。本帖權當是sqlite掃盲,如果你對sqlite已經很熟悉,本文就不必再看了。技術上的優點和特性 sqlite是乙個輕量級 跨平台的關係型資...
瞎掰 Sqlite資料庫
為了方便專案的跨平台,在選用資料庫時選擇了輕量級的跨平台資料庫 sqlite 在使用過程中,將常用介面封裝了一下,使 相對簡潔,使用起來也相對方便。目前封裝了兩個介面 一 封裝了sqlite3 exec介面 int homedatabase callmysql sqlite3 sqlfd,const...