日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

SQLite学习手册(C/C++接口简介)

發布時間:2025/3/12 c/c++ 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLite学习手册(C/C++接口简介) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概述:

?? ?在SQLite提供的C/C++接口中,其中5個APIs屬于核心接口。在這篇博客中我們將主要介紹它們的用法,以及它們所涉及到的核心SQLite對象,如database_connection和prepared_statement。相比于其它數據庫引擎提供的APIs,如OCI、MySQL API等,SQLite提供的接口還是非常易于理解和掌握的。
?? ?
二、核心對象和接口:

?? ?1. 核心對象:
?? ?在SQLite中最主要的兩個對象是,database_connectionprepared_statement。database_connection對象是由sqlite3_open()接口函數創建并返回的,在應用程序使用任何其他SQLite接口函數之前,必須先調用該函數以便獲得database_connnection對象,在隨后的其他APIs調用中,都需要該對象作為輸入參數以完成相應的工作。至于prepare_statement,我們可以簡單的將它視為編譯后的SQL語句,因此,所有和SQL語句執行相關的函數也都需要該對象作為輸入參數以完成指定的SQL操作。
?? ?
?? ?2. 核心接口:
?? ?1). sqlite3_open
?? ?上面已經提到過這個函數了,它是操作SQLite數據庫的入口函數。該函數返回的database_connection對象是很多其他SQLite APIs的句柄參數。注意,我們通過該函數既可以打開已經存在的數據庫文件,也可以創建新的數據庫文件。對于該函數返回的database_connection對象,我們可以在多個線程之間共享該對象的指針,以便完成和數據庫相關的任意操作。然而在多線程情況下,我們更為推薦的使用方式是,為每個線程創建獨立的database_connection對象。對于該函數還有一點也需要額外說明,我們沒有必要為了訪問多個數據庫而創建多個數據庫連接對象,因為通過SQLite自帶的ATTACH命令可以在一個連接中方便的訪問多個數據庫。
?? ??? ?
?? ?2). sqlite3_prepare
?? ?該函數將SQL文本轉換為prepared_statement對象,并在函數執行后返回該對象的指針。事實上,該函數并不會評估參數指定SQL語句,它僅僅是將SQL文本初始化為待執行的狀態。最后需要指出的,對于新的應用程序我們可以使用sqlite3_prepare_v2接口函數來替代該函數以完成相同的工作。
?? ?
?? ?3). sqlite3_step
?? ?該函數用于評估sqlite3_prepare函數返回的prepared_statement對象,在執行完該函數之后,prepared_statement對象的內部指針將指向其返回的結果集的第一行。如果打算進一步迭代其后的數據行,就需要不斷的調用該函數,直到所有的數據行都遍歷完畢。然而對于INSERT、UPDATE和DELETE等DML語句,該函數執行一次即可完成。
?? ?
?? ?4). sqlite3_column
?? ?該函數用于獲取當前行指定列的數據,然而嚴格意義上講,此函數在SQLite的接口函數中并不存在,而是由一組相關的接口函數來完成該功能,其中每個函數都返回不同類型的數據,如:
?? ?sqlite3_column_blob
??? sqlite3_column_bytes
??? sqlite3_column_bytes16
??? sqlite3_column_double
??? sqlite3_column_int
??? sqlite3_column_int64
??? sqlite3_column_text
??? sqlite3_column_text16
??? sqlite3_column_type
??? sqlite3_column_value
??? sqlite3_column_count
?? ?其中sqlite3_column_count函數用于獲取當前結果集中的字段數據。下面是使用sqlite3_step和sqlite3_column函數迭代結果集中每行數據的偽代碼,注意這里作為示例代碼簡化了對字段類型的判斷:

1 int fieldCount = sqlite3_column_count(...); 2 while (sqlite3_step(...) <> EOF) { 3 for (int i = 0; i < fieldCount; ++i) { 4 int v = sqlite3_column_int(...,i); 5 } 6 }

??? 5). sqlite3_finalize
?? ?該函數用于銷毀prepared statement對象,否則將會造成內存泄露。
?? ?
?? ?6). sqlite3_close
?? ?該函數用于關閉之前打開的database_connection對象,其中所有和該對象相關的prepared_statements對象都必須在此之前先被銷毀。
?? ?
三、參數綁定:

?? ?和大多數關系型數據庫一樣,SQLite的SQL文本也支持變量綁定,以便減少SQL語句被動態解析的次數,從而提高數據查詢和數據操作的效率。要完成該操作,我們需要使用SQLite提供的另外兩個接口APIs,sqlite3_reset和sqlite3_bind。見如下示例:

1 void test_parameter_binding() { 2 //1. 不帶參數綁定的情況下插入多條數據。 3 char strSQL[128]; 4 for (int i = 0; i < MAX_ROWS; ++i) { 5 sprintf(strSQL,"insert into testtable values(%d)",i); 6 sqlite3_prepare_v2(..., strSQL); 7 sqlite3_step(prepared_stmt); 8 sqlite3_finalize(prepared_stmt); 9 } 10 //2. 參數綁定的情況下插入多條數據。 11 string strSQLWithParameter = "insert into testtable values(?)"; 12 sqlite3_prepare_v2(..., strSQL); 13 for (int i = 0; i < MAX_ROWS; ++i) { 14 sqlite3_bind(...,i); 15 sqlite3_step(prepared_stmt); 16 sqlite3_reset(prepared_stmt); 17 } 18 sqlite3_finalize(prepared_stmt); 19 }

??? 這里首先需要說明的是,SQL語句"insert into testtable values(?)"中的問號(?)表示參數變量的占位符,該規則在很多關系型數據庫中都是一致的,因此這對于數據庫移植操作還是比較方便的。
?? ?通過上面的示例代碼可以顯而易見的看出,參數綁定寫法的執行效率要高于每次生成不同的SQL語句的寫法,即2)在效率上要明顯優于1),下面是針對這兩種寫法的具體比較:
?? ?1). 單單從程序表面來看,前者在for循環中執行了更多的任務,比如字符串的填充、SQL語句的prepare,以及prepared_statement對象的釋放。
?? ?2). 在SQLite的官方文檔中明確的指出,sqlite3_prepare_v2的執行效率往往要低于sqlite3_step的效率。
?? ?3). 當插入的數據量較大時,后者帶來的效率提升還是相當可觀的。


與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的SQLite学习手册(C/C++接口简介)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。