初入sqlite3 學習彙總(c介面)
介紹
SQLite,是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域專案。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。它能夠支援Windows/Linux/Unix等等主流的作業系統,同時能夠跟很多程式語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC介面,同樣比起Mysql、PostgreSQL這兩款開源的世界著名資料庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生於2000年5月。 至2015年已經有15個年頭,SQLite也迎來了一個版本 SQLite 3已經發布。
安裝
windows下去sqlite官網下載下載dll-x86(或dll-x64)和 sqlite-tools兩個包,然後解壓到某個目錄下,再將這個安裝目錄配置環境變數,如何安裝沒有問題CMD下輸入sqlite3將會顯示如下版本資訊:
linux下通常會自帶安裝,如果沒有執行sudo apt install sqlite3即可。
常用C介面函式
建立或開啟資料庫檔案
int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open_v2( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb, /* OUT: SQLite db handle */ int flags, /* Flags */ const char *zVfs /* Name of VFS module to use */ );
關閉資料
int sqlite3_close(sqlite3*);
int sqlite3_close_v2(sqlite3*);
執行sql語句int sqlite3_exec( sqlite3*, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *, /* 1st argument to callback */ char **errmsg /* Error msg written here */ );
exec其實是封裝了下面三個函式
語句物件
typedef struct sqlite3_stmt sqlite3_stmt;
int sqlite3_prepare(//準備語句物件 sqlite3 *db, /* Database handle */ const char *zSql, /* SQL statement, UTF-8 encoded */ int nByte, /* Maximum length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ ); int sqlite3_prepare_v2( sqlite3 *db, /* Database handle */ const char *zSql, /* SQL statement, UTF-8 encoded */ int nByte, /* Maximum length of zSql in bytes. */ sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ ); int sqlite3_prepare_v3( sqlite3 *db, /* Database handle */ const char *zSql, /* SQL statement, UTF-8 encoded */ int nByte, /* Maximum length of zSql in bytes. */ unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ );
int sqlite3_step(sqlite3_stmt*);//執行語句
int sqlite3_finalize(sqlite3_stmt *pStmt);//銷燬語句
獲得繫結的索引個數
int sqlite3_bind_parameter_count(sqlite3_stmt*);通過名稱獲得項的索引號
int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);通過名稱獲得項的索引號
int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
通過索引項獲得名稱
const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
為語句物件增加資料
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64, void(*)(void*)); int sqlite3_bind_double(sqlite3_stmt*, int, double); int sqlite3_bind_int(sqlite3_stmt*, int, int); int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); int sqlite3_bind_null(sqlite3_stmt*, int); int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*)); int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, void(*)(void*), unsigned char encoding); int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, const char*,void(*)(void*)); int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64);
重置語句物件,重新繫結
int sqlite3_reset(sqlite3_stmt *pStmt);
返回查詢結果集的某一列
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); const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); int sqlite3_column_bytes(sqlite3_stmt*, int iCol); int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); int sqlite3_column_type(sqlite3_stmt*, int iCol);
查詢獲取結果
int sqlite3_get_table( sqlite3 *db, /* An open database */ const char *zSql, /* SQL to be evaluated */ char ***pazResult, /* Results of the query */ int *pnRow, /* Number of result rows written here */ int *pnColumn, /* Number of result columns written here */ char **pzErrmsg /* Error msg written here */ ); void sqlite3_free_table(char **result); //不要直接用sqlite3_free函式釋放
分配和釋放記憶體
void *sqlite3_malloc(int); void *sqlite3_malloc64(sqlite3_uint64); void *sqlite3_realloc(void*, int); void *sqlite3_realloc64(void*, sqlite3_uint64); void sqlite3_free(void*); sqlite3_uint64 sqlite3_msize(void*);
執行錯誤碼#define SQLITE_OK 0 /* Successful result */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* An internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite_interrupt() */
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* (Internal Only) Table or record not found */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* (Internal Only) Database table is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT 19 /* Abort due to contraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_ROW 100 /* sqlite_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite_step() has finished executing */
案例
- #include <stdio.h>
- #include <string.h>
- #include <sqlite3.h>
- /***************************
- typedef int (*sqlite3_callback)(
- void*, // Data provided in the 4th argument of sqlite3_exec()
- int, // The number of columns in row
- char**, // An array of strings representing fields in the row
- char** // An array of strings representing column names
- );
- ***************************/
- /* callback函式只有在對資料庫進行select, 操作時才會呼叫 */
- staticint select_callback(void *data, int argc, char **argv, char **azColName){
- int i;
- printf("%s", (char*)data);
- for(i=0; i < argc; i++){
- printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
- }
- printf("\n");
- return 0;
- }
- int main(int argc, char* argv[])
- {
- sqlite3 *db;
- char *zErrMsg = 0;
- int rc;
- /* 資料庫建立或開啟 */
- rc = sqlite3_open("test.db", &db);
- if( rc ){
- fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
- exit(0);
- }else{
- fprintf(stderr, "Opened database successfully\n");
- }
- char* sql;
- sql = "create table healthinfo (" \
- "sid int primary key not null," \
- "name text not null," \
- "ishealth char(4) not null);";
- /* 建立表 */
- rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);
- if( rc != SQLITE_OK ){
- fprintf(stderr, "SQL error: %s\n", zErrMsg);
- sqlite3_free(zErrMsg);
- }else{
- fprintf(stdout, "Table created successfully\n");
- }
- sql = "insert into healthinfo (sid, name, ishealth)" \
- "values (201601001, 'xiaowang', 'yes');" \
- "insert into healthinfo (sid, name, ishealth)" \
- "values (201601002, 'xiaoli', 'yes');" \
- "insert into healthinfo (sid, name, ishealth)" \
- "values (201601003, 'xiaozhang', 'no');" \
- "insert into healthinfo (sid, name, ishealth)" \
- "values (201601004, 'xiaozhou', 'yes');" \
- "insert into healthinfo (sid, name, ishealth)" \
- "values (201601005, 'xiaosun', 'yes');";
- /* 插入資料 */
- rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);
- if( rc != SQLITE_OK ){
- fprintf(stderr, "SQL error: %s\n", zErrMsg);
- sqlite3_free(zErrMsg);
- }else{
- fprintf(stdout, "Table insert data successfully\n");
- }
- char* strname = "xiaoyang";
- //char strname[256] = {'x','i','a','o','y','a','n','g'};
- char sql2[256] = {'0'};
- /* 不推薦使用這種方式 */
- sprintf(sql2, "insert into healthinfo (sid, name, ishealth) values (201601006, '%s', 'yes');", strname);
- /* 插入資料 */
- rc = sqlite3_exec(db, sql2, NULL, NULL, &zErrMsg);
- if( rc != SQLITE_OK ){
- fprintf(stderr, "SQL error: %s\n", zErrMsg);
- sqlite3_free(zErrMsg);
- }else{
- fprintf(stdout, "Table insert data successfully\n");
- }
- /*********** 存資料和取資料的第二種方法***********/
- sql = "insert into healthinfo (sid, name, ishealth)" \
- "values (:sid, :name, :ishealth);"; /* 注: ":sid" 為命名引數 也可以用? 號*/
- sqlite3_stmt *stmt;
- /* 準備一個語句物件 */
- sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL);
- /* 語句物件繫結的引數個數也就是上面sql語句values括號中的引數 */
- printf("max_parameter_count = %d\n", sqlite3_bind_parameter_count(stmt));
- /* 只有上面指定了:sid這個名字才可以用 */
- printf("sid parameter index = %d\n", sqlite3_bind_parameter_index(stmt, ":sid"));
- printf("name parameter index = %d\n", sqlite3_bind_parameter_index(stmt, ":name"));
- printf("ishealth parameter index = %d\n", sqlite3_bind_parameter_index(stmt, ":ishealth"));
- /* 如果是?號命名的則返回的文字為null */
- printf("index = 1 's parameter's name = %s\n", sqlite3_bind_parameter_name(stmt, 1));
- sqlite3_bind_int(stmt, 1, 201601007);
- sqlite3_bind_text(stmt, 2, "xiaoqian", -1, NULL); /* 第四個引數設為負數則自動計算第三個引數的長度 */
- sqlite3_bind_text(stmt, 3, "yes", 3, NULL);
- //sqlite3_bind_blob(stmt, 1, sectionData, 4096, SQLITE_STATIC); /* 將sectonData 繫結到stmt物件 */
- /* 執行sql 語句物件並判斷其返回值
- 發現如果不是select 這樣會產生結果集的操作
- 返回值為SQLITE_DONE 或者出錯,只有執行sql語句會產生
- 結果集執行step函式才返回SQLITE_ROW*/
-
相關推薦
初入sqlite3 學習彙總(c介面)
介紹 SQLite,是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域專案。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的
Qt學習總結(C魚)之信號與槽01
Qt 學習 總結 C魚 自動關聯 第一種自然是手動關聯了,只要調用connect函數就能實現自動關聯。這裏重點講第二種,自動關聯:為了實現槽函數自動進行關聯,對於Qt窗口部件已經提供的信號,可按照以下規範命名:void on_<窗口部件名稱>_<信號名
Qt學習總結(C魚)之路徑參數引用
Qt學習總結(C魚)之路徑參數引用1.引用相對路徑: 例如: QCursor cursor(QPixmap("1.png")); 問題:會發現引用失敗,這是因為相對路徑都是從當前工作目錄開始找起文件的。可以通過以下函數獲取當前工作目錄: bool QDir::setCurrent ( co
常見排序演算法彙總(C++實現)
插入排序 #include<iostream> using namespace std; /* 插入排序的細節講解與複雜度分析 時間複雜度O(N ^ 2),額外空間複雜度O(1) */ void InsertSort(int *arr, int length) { int i,
六大排序演算法與常見的兩大查詢演算法彙總(C語言)
六大排序演算法程式如下: #include<stdio.h> /*void Bubblesort(int arry[],int len)//氣泡排序演算法 { int i,j; for(i=0;i<len-1;i++) { for(j=i+1;j<le
設計模式學習筆記(C++實現)(三)--抽象工廠模式
1.抽象工廠模式簡介 英文名稱 Abstract Factory 主要目的 該模式定義了一系列相關或者相互依賴物件的介面,而不用指定它們具體的類。 使用場景 1.一個系統需要獨立於它的產品的建立、組合和表示時; 2.一個系統要由多個產品系列中的一個來
設計模式學習筆記(C++實現)(十六)--直譯器模式
1.直譯器模式簡介 英文名稱 Interpreter 主要目的 給定一種語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語言中的句子。 使用場景 當有一種語言需要解釋執行,並且你可以將該語言中的句子表示為一個抽象語法樹時,最適
cocos2d-x學習筆記(c++與lua交互回調函數的處理)
回調函數 tolua++ cocos2dx lua 本文假設讀者已經會使用tolua++進行C++與lua之間的通訊1、在頭文件中定義註冊回調函數,定義在MyClass類中void register(unsigned short cmdID, LUA_FUNCTION func);//LUA_
RabbitMQ基礎學習筆記(C#代碼示例)
esp 輸出 出隊 csharp 實例代碼 為什麽 mode 規則 無需 一、定義: MQ是MessageQueue,消息隊列的簡稱(是流行的開源消息隊列系統,利用erlang語言開發)。MQ是一種應用程序對應用程序的通信方法。應用程序通過讀寫入隊和出隊的消息來通信
C# XML類學習整理(待補)
del logs delegate clas ole nod reg nodelist tel 一、讀取xml文件內容: #region "獲取xml文件內容" //將xml文件加載進來 XDocument x
java基礎學習總結(十五):抽象類與介面
抽象類與介面是java語言中對抽象概念進行定義的兩種機制,正是由於他們的存在才賦予java強大的面向物件的能力。他們兩者之間對抽象概念的支援有很大的相似,甚至可以互換,但是也有區別。 一、抽象類 &n
c++ primer第五版----學習筆記(十九)Ⅱ
部分習題解答: 19.1、19.2: #include <iostream> #include <cstdlib> using namespace std; void *operator new(size_t size) { cout << "new(
c++ primer第五版----學習筆記(十九)Ⅰ
文章目錄 ==特殊工具與技術== 1.控制記憶體分配 1.1 過載new和delete 1.2 定位new表示式 2. 執行時型別識別 2.1 dynamic_cast運算子 2.2 typeid運算子
c++primer第五版----學習筆記(十八)Ⅱ
部分習題解答: 18.1: (a)range_error (b)exception 如果寫成throw p,則丟擲指標,是錯誤的18.2: 發生異常,所在塊之前的臨時變數都會被銷燬,v呼叫vector類的解構函式進行銷燬,並釋放相關記憶體;p指標會被銷燬,但p指向的記憶體是動態分配的,所以該記憶
c++ primer第五版----學習筆記(十八)Ⅰ
用於大型程式的工具:異常處理、名稱空間和多重繼承 特殊要求: 在獨立開發的子系統之間協同處理錯誤的能力 使用各種庫(可能包含獨立開發的庫)進行協同開發的能力 對比較複雜的應用概念建模的能力 1.異常處理: 異常處理機制允許程式中獨立開發的部分能夠在執行
WebGL學習資源彙總(持續更新)
WebGL學習資源彙總 書籍 書籍 計算機圖形影象處理基礎 WebGL程式設計指南 書籍介紹: 《計算機圖形影象處理基礎》是2011年電子工業出版社出版的圖書,作者是唐波。全書共分10章,主要內容包括了圖形與
UVM_USERS_GUIDE學習彙總(持續更新中)
1.overview 本章節通過典型的testbench架構和引入相關術語提供一個uvm的基本概述。 1.1 the typical uvm testbench architecture 1.1.1 uvm testbench UVM Testbench 例化了Des
SAP移庫介面實現(C#版)
SAP移庫介面C#版本實現程式碼如下: /// <summary> /// 移庫介面(將倉庫中的地址移到線邊倉,線邊倉的地址用模板檔名稱作為引數傳過來) /// </summary> /// <param
SAP發料介面實現(C#版)
//發料介面 /// <summary> /// 根據發料單號獲取發料單內所包含的物料資訊,根據生產訂單的編號,發料至生產訂單 /// </summary> /// <param name
新手學習python(十八)開發介面
#開發介面#1.mock介面,模擬一些介面,在別的介面沒有開發好的時候,你需要用它#2.客戶端,服務端的互動#3.檢視資料import flask,json,pymysqldef my_db(sql): coon=pymysql.connect( host='118.24.xx.xx',u