c語言sqlite
㈠ c璇璦涓璁塊棶鏁版嵁搴撻兘鐢ㄥ埌浜嗗摢浜涚被錛
鍦–璇璦涓錛岃塊棶鏁版嵁搴撻氬父娑夊強浣跨敤鏁版嵁搴撴搷浣滃簱錛岃繖浜涘簱鎻愪緵浜嗕竴浜涚被鍜屽嚱鏁版潵鎵ц屾暟鎹搴撴搷浣溿傛渶甯哥敤鐨勬暟鎹搴撴搷浣滃簱鏄疧DBC錛圤pen Database Connectivity錛夛紝瀹冨厑璁鎬嬌鐢ㄦ爣鍑嗙殑API鎺ュ彛鏉ヨ繛鎺ュ拰鎿嶄綔涓嶅悓綾誨瀷鐨勬暟鎹搴撱備互涓嬫槸鍦–璇璦涓璁塊棶鏁版嵁搴撴椂鍙鑳芥秹鍙婄殑涓浜涚被鍜岀浉鍏蟲傚康錛
1. **ODBC API錛** ODBC API鏄鏁版嵁搴撹塊棶鐨勬牳蹇冿紝瀹冩彁渚涗簡涓緋誨垪鍑芥暟鐢ㄤ簬榪炴帴鏁版嵁搴撱佹墽琛孲QL鏌ヨ銆佽幏鍙栨煡璇㈢粨鏋滅瓑鎿嶄綔銆
2. **鏁版嵁搴撹繛鎺ョ被錛** 鏁版嵁搴撹繛鎺ョ被鐢ㄤ簬寤虹珛鍜岀$悊涓庢暟鎹搴撶殑榪炴帴銆傚湪ODBC涓錛屽彲浠ヤ嬌鐢╜sqlHDBC`鏁版嵁綾誨瀷琛ㄧず鏁版嵁搴撹繛鎺ュ彞鏌勩
3. **SQL璇鍙ユ墽琛岀被錛** 榪欎簺綾葷敤浜庢墽琛孲QL鏌ヨ㈣鍙ワ紝鍖呮嫭SELECT銆両NSERT銆乁PDATE銆丏ELETE絳夈傚彲浠ヤ嬌鐢╜SQLExecDirect`鍑芥暟鎵ц孲QL璇鍙ャ
4. **緇撴灉闆嗙被錛** 褰撴墽琛孲ELECT鏌ヨ㈡椂錛屼細鐢熸垚涓涓緇撴灉闆嗭紝琛ㄧず鏌ヨ㈢粨鏋溿傚彲浠ヤ嬌鐢╜SQLHSTMT`鏁版嵁綾誨瀷琛ㄧず緇撴灉闆嗗彞鏌勶紝騫朵嬌鐢╜SQLFetch`鍑芥暟鑾峰彇緇撴灉闆嗕腑鐨勬暟鎹銆
5. **閿欒澶勭悊綾伙細** 鐢ㄤ簬澶勭悊鏁版嵁搴撴搷浣滀腑鐨勯敊璇鍜屽紓甯搞傚彲浠ヤ嬌鐢╜SQLHENV`鏁版嵁綾誨瀷琛ㄧず鐜澧冨彞鏌勶紝騫朵嬌鐢╜SQLError`鍑芥暟鑾峰彇閿欒淇℃伅銆
6. **鍙傛暟鍖栨煡璇㈢被錛** 鐢ㄤ簬鎵ц屽弬鏁板寲鐨凷QL鏌ヨ錛岄槻姝SQL娉ㄥ叆絳夊畨鍏ㄩ棶棰樸
7. **浜嬪姟綆$悊綾伙細** 鐢ㄤ簬綆$悊鏁版嵁搴撶殑浜嬪姟鎿嶄綔錛屽寘鎷鎻愪氦鍜屽洖婊氫簨鍔°
8. **鏁版嵁搴撹繛鎺ユ睜綾伙細** 鏁版嵁搴撹繛鎺ユ睜鐢ㄤ簬綆$悊澶氫釜鏁版嵁搴撹繛鎺ワ紝鎻愰珮鎬ц兘鍜岃祫婧愬埄鐢ㄧ巼銆
闇瑕佹敞鎰忕殑鏄錛孋璇璦鏈韜騫舵病鏈夌被鐨勬傚康錛岃屾槸浣跨敤緇撴瀯浣撱佹寚閽堝拰鍑芥暟絳夋潵瀹炵幇闈㈠悜瀵硅薄鐨勫姛鑳姐傛暟鎹搴撴搷浣滃簱浼氭彁渚涗竴浜涙暟鎹綾誨瀷鍜屽嚱鏁版潵灝佽呮暟鎹搴撶浉鍏蟲搷浣滐紝浣嗚繖浜涘苟涓嶆槸浼犵粺鎰忎箟涓婄殑綾匯傚湪瀹為檯寮鍙戜腑錛屽彲浠ユ牴鎹鎵浣跨敤鐨勬暟鎹搴撴搷浣滃簱鐨勬枃妗e拰紺轟緥鏉ヤ簡瑙e備綍榪涜屾暟鎹搴撴搷浣溿
㈡ 如何編譯SQLite-How To Compile SQLite
SQLite是ANSI-C的源代碼。在使用之前必須要編譯成機器碼。這篇文章是用於各種編譯SQLite方法的指南。
這篇文章不包含編譯SQLite的每個步驟的反饋,那樣可能會困難因為每種開發場景都不同。所以這篇文章描述和闡述了編譯Sqlite的原則。典型的編譯命令已經作為例子提供了,以期望應用開發者能夠使用這些例子作為完成他們自己定製的編譯過程的的一個指南。換句話說,這篇文章提供了想法和見解,而不是交鑰匙的解決方法。
融合VS單獨源文件
Sqlite是由超過一百個c源碼文件以及眾多的目錄下的腳本構建的。Sqlite的實現是純粹的ANSI-C,但是許多c語言源代碼文件是由輔助的C程序生成或者轉換來的,並且AWK,SED和TCL腳本會融合到完成的sqlite庫中。對Sqlite構建需要的C程序和轉換和創建C語言源碼是一個復雜的過程。
為了簡化這些,sqlite也通過一個預打包的合並後的源碼文件:sqlite3.c。這個合並文件是一個ANSI-C源碼實現整個SQLite庫的唯一文件。合並後的文件更容易處理。所有的東西都包含在這一個文件里,所以很容易進入一個更大的C或者C++程序的源碼樹。所有的代碼生成和轉換步驟都已經實現了,因此沒有輔助的C程序需要去配置和變異,也沒有腳本需要去運行。並且,因此所有哭都包含在一個翻譯單元,編譯器可以做更多高級的優化從而提升5%到10%的性能。因為這些原因,融合後的源碼文件sqlite3.c對所有程序來講都是值得推薦的。
推薦所有的應用程序使用融合文件。
直接從單獨的源碼文件中構建sqlite當然可以,但是並不推薦。對一些特殊的應用程序,可能需要修改構建程序去處理使用那些從網站上下載的預構建的源碼文件不能完成的情況。對於這些情況,推薦構建和使用一個定製過的合並文件。換句話說,即使一個工程需要以單獨的源碼文件構建sqlite,仍然推薦使用一個融合後的源碼文件作為一個中間步驟。
編譯命令行介面(CLI)
構建命令行介面需要三個源碼文件:
sqlite3.c:Sqlite融合的源碼文件
sqlite3.h:匹配sqlite3.c以及定義sqlite的c語言介面的頭文件
shell.c:命令行介面程序本身。這個c源碼文件包含一個main()的常式和每輪循環的用戶輸入的提示符並將輸入傳給sqlite資料庫引擎用於處理。
所有的上述源碼的三個文件都被包含在下載頁面的amalgamation tarball中。
為了構建CLI,簡單的將這三個文件放置在相同的目錄下然後一起編譯他們。用MSVC:
cl shell.c sqlite3.c -Fesqlite3.exe
在unix系統上(或者在windows上用cygwin或者mingw+msys)典型的命令會有些像這樣:
gcc shell.c sqlite3.c -lpthread -ldl
為了SQLite線程安全,需要pthreads庫。但是因為CLI是一個單線程的,我們可以指示SQLite構建一個非線程安全的庫並因此護綠pthreads庫:
gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl
-ldl庫是在支持動態裝載時需要,例如sqlite3_load_extension() 介面和load_extension()
SQL function。如果這些特性都不要求,那麼我們也可以使用SQLITE_OMIT_LOAD_EXTENSION編譯時間選項忽略他們。
gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c
有人可能想要提供其他的編譯時間選項(compile-time options),例如SQLITE_ENABLE_FTS3去全文本搜索或者SQLITE_ENABLE_RTREE用於R*樹搜索引擎擴展。而有人將正常指定一些編譯優化開關。(預編譯的CLI可以從選擇sqlite網站上使用「-Os」下載下來)有無數種可能的變數在這里。
關鍵點在這里:構建CLI需要編譯一起兩個C語言文件。shell.c文件包含入口的定義和用戶輸入的loop,而sqlite融合文件sqlite3.c包含完整的sqlite庫的實現。
編譯TCL介面
sqlite的tcl介面是一個小的模塊被添加到一般的融合文件中。結果是一個新的融合後的源碼文件,稱之為「tclsqlite3.c」。這個源碼文件是生成一個可以使用TCL
load命令去載入到一個標準的tclsh或者wish中,或者隨著sqlite構建成功生成一個單獨唯一的tclsh的共享庫所需要的。一個tcl的融合的副本被包含在下載頁的TEA
tarball中作為一個文件。
為了生成一個linux上的sqlite的TCL-loadable庫,下面的命令需要滿足:
gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl
不幸的是構建Mac OS X 和 Windows的共享庫並不是如此簡單。對於這些平台最好使用包含在TEA tarball中的configure腳本和makefile.
為了生成一個單獨的tclsh,可以用於sqlite靜態鏈接,使用如下的編譯器調用:
gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm
這里的技巧是-DTCLSH=1選項。sqlite的TCL介面模塊包含一個main的過程,用於初始化一個TCL解釋器並在以-DTCLSH=1編譯後進入到一個命令行loop。上述命令可以工作在Linux和Mac
OS X,雖然有時可能需要依賴於平台調整庫選項以及編譯的TCL的哪一個版本。
構建融合文件
下載頁提供的sqlite融合文件的版本對大多數用戶來說是足夠的。然而,一些工程可能想要或者需要構建他們自己的融合文件。一個常見的構建一個定製的融合文件的理由是為了使用特定的compile-time options來定製sqlite庫。回想sqlite融合文件中包含了許多C代碼由輔助程序和腳本生成。許多的編譯時間選項影響這一成聖代碼而且必須在融合文件組裝前提供給代碼生成器。這一系列必須傳給代碼生成器的編譯時間相關的選項會使得sqlite的發布版本各不相同,但是在寫這邊文章的時候,代碼生成器需要知道的這組選項包括:
SQLITE_ENABLE_UPDATE_DELETE_LIMIT
SQLITE_OMIT_ALTERTABLE
SQLITE_OMIT_ANALYZE
SQLITE_OMIT_ATTACH
SQLITE_OMIT_AUTOINCREMENT
SQLITE_OMIT_CAST
SQLITE_OMIT_COMPOUND_SELECT
SQLITE_OMIT_EXPLAIN
SQLITE_OMIT_FOREIGN_KEY
SQLITE_OMIT_PRAGMA
SQLITE_OMIT_REINDEX
SQLITE_OMIT_SUBQUERY
SQLITE_OMIT_TEMPDB
SQLITE_OMIT_TRIGGER
SQLITE_OMIT_VACUUM
SQLITE_OMIT_VIEW
SQLITE_OMIT_VIRTUALTABLE
為了構建一個定製的融合文件,先下載原始的獨立源碼文件到一個unix或者類unix開發平台。確定獲取的原始源碼文件不是「預編譯過的源文件」。任何人都可以通過到下載頁或者直接從configuration management system.獲取完整的一套原始源碼文件。
假設sqlite源碼樹被存在一個名為「sqlite」的目錄下。計劃構建一個平行目錄下的名為「bld」的融合文件。首先通過運行sqlite源碼樹種的configure腳本運行或者通過製作一份源碼樹頂層的的makfile模板的一份,來構建一個合適的makefile.然後手動編輯這個Makfile去包含需要的編譯時間相關的選項。最終運行:
make sqlite3.c
在windows上使用MSVC:
nmake /f Makefile.msc sqlite3.c
sqlite3.c的make
target會自動構造一般的「sqlite3.c」合並的源碼文件,以及它的頭文件「sqlite3.h」,和包含TCL介面的融合源碼文件「tclsqlite3.c」。之後,需要的文件可以被拷貝到文件目錄下然後根據上述勾勒的過程編譯。
構建一個windows的動態鏈接庫DLL
為了在windows構建一個sqlite的dll使用,首先獲取對應的融合過的源碼文件,sqlit3.c和sqlite.h。這些可以從SQLite website上下載或者和上述告知的一樣去定製生成。
使用工作目錄下的源碼文件,一個dll可以在msvc中使用如下命令生成:
cl sqlite3.c -link -dll -out:sqlite3.dll
上述命令需要運行在msvc的MSVC Native Tools Command
Prompt.如何你已經在機器上安裝了msvc,你可能有多個版本的這種命令提示符,針對於x86和x64的自帶構建的,或者交叉編譯到ARM的。依賴要求的DLL去使用對應合適的命令提示符工具。
如果使用MinGW編譯器,命令是這樣的:
gcc -shared sqlite3.c -o sqlite3.dll
注意MinGW只生成32位的dll。另有一個分開的MinGW64工程可以用來生成64位的dll。可以推斷其命令行語法是類似的。需要注意的是最近的MSVC的版本生成的DLLs可能不能工作到WinXP或者更早版本的windows上。因此為了最大限度的兼容你的生成的dll,推薦MinGW。一個好的經驗法則是使用MinGW去生成32位的dlls,使用msvc去生成64位的dlls。
㈢ 玩轉SQLite-11:C語言高效API之sqlite3_prepare系列函數
SQLite資料庫是一個輕量級的資料庫,其C/C++開發支持使其適用於嵌入式系統。本文將介紹一種更為高效的使用SQLite的方法,與上一篇文章中介紹的簡單實例相比,這種方式能提供更好的性能。
傳統的使用方法是通過sqlite3_exec函數來執行SQL語句。它將SQL命令字元串與對應的回調函數結合在一起。然而,這種做法存在效率問題,因為解析和編譯操作在每次調用時都需重復進行,降低了執行效率。
為了提高效率,引入了sqlite3_prepare_v2函數。通過該函數,可以將SQL語句解析和編譯為可以重復執行的實例,從而大大減少了解析和編譯的次數。這意味著在重復執行SQL查詢時,性能得到了顯著提升。
在使用sqlite3_prepare_v2時,還需使用sqlite3_bind函數來綁定變數值到預處理語句中。先創建並初始化一個sqlite3_stmt變數,然後通過sqlite3_bind_xxx函數對變數進行參數綁定。
對於SQL查詢的結果,可以使用sqlite3_step函數來執行查詢並獲取結果。返回值與錯誤碼相關,用於檢查執行狀態。
在執行完查詢後,sqlite3_reset函數用於將准備語句重置到初始狀態,以便重新執行。此操作不會改變綁定值,可能用於重置到某個特定狀態。
查詢結果的特定列可以通過sqlite3_column函數獲取。該函數用於查詢結果集並返回特定列的數據。
本文總結了高效API函數的核心點,並介紹了這些函數的使用方法。下一篇文章將通過實際案例,展示這些函數如何在實踐中提高性能。
㈣ SQLITE資料庫C語言API 想使當資料庫不存在時 sqlite3_open 不創建資料庫
改用sqlite3_open_v2函數打開
int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags,const char *zVfs);
前兩個參數與sqllite3_open一樣,flags設置為SQLITE_OPEN_READWRITE,如果資料庫不存在就不創建,只返回一個error
參數zVfs允許應用程序命名一個虛擬文件系統(Virtual File System)模塊,用來與資料庫連接。VFS作為SQlite library和底層存儲系統(如某個文件系統)之間的一個抽象層,通常客戶應用程序可以簡單的給該參數傳遞一個NULL指針,以使用默認的VFS模塊。