1. 程式人生 > >初入sqlite3 學習彙總(c介面)

初入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 */

案例

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sqlite3.h>
  4. /*************************** 
  5. typedef int (*sqlite3_callback)( 
  6. void*,    // Data provided in the 4th argument of sqlite3_exec() 
  7. int,        // The number of columns in row  
  8. char**,   // An array of strings representing fields in the row  
  9. char**    // An array of strings representing column names  
  10. ); 
  11. ***************************/
  12. /* callback函式只有在對資料庫進行select, 操作時才會呼叫 */
  13. staticint select_callback(void *data, int argc, char **argv, char **azColName){  
  14.    int i;  
  15.    printf("%s", (char*)data);  
  16.    for(i=0; i < argc; i++){  
  17.       printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");  
  18.    }  
  19.    printf("\n");  
  20.    return 0;  
  21. }  
  22. int main(int argc, char* argv[])  
  23. {  
  24.    sqlite3 *db;  
  25.    char *zErrMsg = 0;  
  26.    int rc;  
  27.    /* 資料庫建立或開啟 */
  28.    rc = sqlite3_open("test.db", &db);  
  29.    if( rc ){  
  30.       fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));  
  31.       exit(0);  
  32.    }else{  
  33.       fprintf(stderr, "Opened database successfully\n");  
  34.    }  
  35.    char* sql;  
  36.    sql = "create table healthinfo (" \  
  37.            "sid int primary key not null," \  
  38.            "name text not null," \  
  39.            "ishealth char(4) not null);";  
  40.    /* 建立表 */
  41.    rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);  
  42.    if( rc != SQLITE_OK ){  
  43.       fprintf(stderr, "SQL error: %s\n", zErrMsg);  
  44.       sqlite3_free(zErrMsg);  
  45.    }else{  
  46.       fprintf(stdout, "Table created successfully\n");  
  47.    }  
  48.    sql = "insert into healthinfo (sid, name, ishealth)" \  
  49.            "values (201601001, 'xiaowang', 'yes');" \  
  50.            "insert into healthinfo (sid, name, ishealth)" \  
  51.            "values (201601002, 'xiaoli', 'yes');" \  
  52.            "insert into healthinfo (sid, name, ishealth)" \  
  53.            "values (201601003, 'xiaozhang', 'no');" \  
  54.            "insert into healthinfo (sid, name, ishealth)" \  
  55.            "values (201601004, 'xiaozhou', 'yes');" \  
  56.            "insert into healthinfo (sid, name, ishealth)" \  
  57.            "values (201601005, 'xiaosun', 'yes');";  
  58.     /* 插入資料 */
  59.    rc = sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);  
  60.    if( rc != SQLITE_OK ){  
  61.       fprintf(stderr, "SQL error: %s\n", zErrMsg);  
  62.       sqlite3_free(zErrMsg);  
  63.    }else{  
  64.       fprintf(stdout, "Table insert data successfully\n");  
  65.    }  
  66.    char* strname = "xiaoyang";  
  67.    //char strname[256] = {'x','i','a','o','y','a','n','g'};
  68.    char sql2[256] = {'0'};  
  69.    /* 不推薦使用這種方式 */
  70.    sprintf(sql2, "insert into healthinfo (sid, name, ishealth) values (201601006, '%s', 'yes');", strname);  
  71.     /* 插入資料 */
  72.    rc = sqlite3_exec(db, sql2, NULL, NULL, &zErrMsg);  
  73.    if( rc != SQLITE_OK ){  
  74.       fprintf(stderr, "SQL error: %s\n", zErrMsg);  
  75.       sqlite3_free(zErrMsg);  
  76.    }else{  
  77.       fprintf(stdout, "Table insert data successfully\n");  
  78.    }  
  79.    /***********  存資料和取資料的第二種方法***********/
  80.    sql = "insert into healthinfo (sid, name, ishealth)" \  
  81.            "values (:sid, :name, :ishealth);";   /* 注: ":sid" 為命名引數 也可以用? 號*/
  82.    sqlite3_stmt *stmt;  
  83.    /* 準備一個語句物件 */
  84.    sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, NULL);   
  85.    /* 語句物件繫結的引數個數也就是上面sql語句values括號中的引數 */
  86.    printf("max_parameter_count = %d\n", sqlite3_bind_parameter_count(stmt));  
  87.    /* 只有上面指定了:sid這個名字才可以用 */
  88.    printf("sid parameter index = %d\n", sqlite3_bind_parameter_index(stmt, ":sid"));   
  89.    printf("name parameter index = %d\n", sqlite3_bind_parameter_index(stmt, ":name"));  
  90.    printf("ishealth parameter index = %d\n", sqlite3_bind_parameter_index(stmt, ":ishealth"));  
  91.    /* 如果是?號命名的則返回的文字為null */
  92.    printf("index = 1 's parameter's name = %s\n", sqlite3_bind_parameter_name(stmt, 1));   
  93.    sqlite3_bind_int(stmt, 1, 201601007);  
  94.    sqlite3_bind_text(stmt, 2, "xiaoqian", -1, NULL); /* 第四個引數設為負數則自動計算第三個引數的長度 */
  95.    sqlite3_bind_text(stmt, 3, "yes", 3, NULL);  
  96.    //sqlite3_bind_blob(stmt, 1, sectionData, 4096, SQLITE_STATIC); /* 將sectonData 繫結到stmt物件 */
  97.    /* 執行sql 語句物件並判斷其返回值 
  98.        發現如果不是select 這樣會產生結果集的操作 
  99.        返回值為SQLITE_DONE 或者出錯,只有執行sql語句會產生 
  100.        結果集執行step函式才返回SQLITE_ROW*/
  101. 相關推薦

    sqlite3 學習彙總c介面

    介紹  SQLite,是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域專案。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的

    Qt學習總結C之信號與槽01

    Qt 學習 總結 C魚 自動關聯 第一種自然是手動關聯了,只要調用connect函數就能實現自動關聯。這裏重點講第二種,自動關聯:為了實現槽函數自動進行關聯,對於Qt窗口部件已經提供的信號,可按照以下規範命名:void on_&lt;窗口部件名稱&gt;_&lt;信號名

    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