• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Sqlite3入門學習(一)

    標簽: 數據庫  sqlite

    Linux環境下sqlite3的安裝及常用Linux API說明

    1. 環境安裝

    Step1:一般的linux可能會自帶sqlite,在安裝之前先使用sqlite3命令檢測一下,若顯示并未安裝,則進行下述操作

    Step2:先到  https://www.sqlite.org/download.html ,下載sqlite-autoconf-*.tar.gz壓縮包

    Step3:下載完了,把壓縮包放進Linux系統中,放在Ubuntu的桌面,然后解壓

    Step4:進入解壓后路徑接著執行命令./configure --prefix=/usr/local  表示安裝至usr/local路徑下;

    Step5: 接著執行命令  make

    Step6: 最后執行命令make install

    Step7:執行命令sqlite3,檢測是否安裝成功,如下圖所示表示安裝成功

    1. 常用Linux API說明
      1. sqlite3_open

    int sqlite3_open(const char* fileName, sqlite3** ppDB);

    函數功能:打開一個數據庫;若該數據庫文件不存在,則自動創建。打開或者創建數據庫的命令會被緩存,直到這個數據庫真正被調用的時候才會被執行。

    輸入參數:fileName,待打開的數據庫文件名稱,包括路徑,以'\0'結尾;

    特別說明:SQLite 支持內存數據庫,內存方式存儲使用文件名":memory:"

    輸出參數:ppDB,返回打開的數據庫句柄;

    返回值:執行成功返回SQLITE_OK,否則返回其他值;

     

      1. sqlite3_close

    int sqlite3_close(sqlite3* pDB);

    函數功能:關閉一個打開的數據庫;

    輸入參數:pDB,打開的數據庫句柄

    輸出參數: 無

    返回值:執行成功返回SQLITE_OK,否則返回其他值

      1. sqlite3_exec

    函數功能:編譯和執行零個或多個SQL 語句,查詢的結果返回給回調函數callback

    int sqlite3_exec(sqlite3* pDB, const char *sql, sqlite_callback callback, void*para, char** errMsg);

    輸入參數:

    pDB:數據庫句柄;

    sql:待執行的SQL 語句字符串,以'\0'結尾;

    callback:回調函數,用來處理查詢結果,可以輸入NULL;

    para:傳入的參數,可以為NULL,該參數被傳給回調函數callback調用;

    輸出參數:errMsg,返回錯誤信息,注意是指針的指針。

    返回值:執行成功返回SQLITE_OK,否則返回其他值

      1. sqlite3_busy_handle()

    int sqlite3_busy_handle(sqlite3*, int(*)(void *, int), void *);

    第一個參數:當你調用sqlite_busy_handle函數時傳遞給它的一個void*的參數的拷貝;

    第二個參數是因此這次鎖事件,該回調函數被調用的次數。

    如果回調函數返回0時,將不再嘗試再次訪問數據庫而返回SQLITE_BUSY或者SQLITE_IOERR_BLOCKED。

    如果回調函數返回非0, 將會不斷嘗試操作數據庫。

     

    詳細說明:程序運行過程中,如果有其他進程或者線程在讀寫數據庫,那么sqlite3_busy_handler會不斷調用回調函數,直到其他進程或者線程釋放鎖。獲得鎖之后,不會再調用回調函數,從而向下執行,進行數據庫其他操作

      1. sqlite3_get_table()

    此函數接受sql中的SQL語句返回的所有記錄,使用堆上聲明的內存(使用sqlite3_malloc())將所有記錄存儲在參數char*** pazResult中。必須使用sqlite3_table_free()函數釋放內存

    該函數將char ***pazResult指針作為唯一的參數。pazResult中的第一個記錄其實并不是記錄,而且結果集中列的名稱。

    int sqlite3_get_table(
           sqlite3 *db,         //打開的數據庫的句柄
           const char *zSql,    //要執行的SQL語句
           char ***pazResult,   //結果寫入該指針指向的char***
           int *pnRow,          //結果集中行的數目
           int *pnColumn,       //結果集中列的數目
           char **pzErrmsg      //錯誤信息
    );

    第2個參數是sql 語句,跟sqlite3_exec 里的sql 是一樣的。是一個很普通的以\0結尾的char*字符串。

    第3個參數是查詢結果,它依然一維數組,它內存布局是:字段名稱,后面是緊接著是每個字段的值。第4個參數是查詢出多少條記錄(即查出多少行,不包括字段名那行)。

    第5個參數是多少個字段(多少列)。

    第6個參數是錯誤信息。

    pazResult返回的字符串數量實際上是(*pnRow+1)*(*pnColumn),因為前(*pnColumn)個是字段名

    編程示例

    #include <stdio.h>
    #include <sqlite3.h>
    #include <string.h>
    int callback(void*,int,char**,char**);
    int main()
    {
        sqlite3* db;
        char* errmsg;
        char *strSql = (char*)malloc(sizeof(char)*2048*1024);
        char *showResult;
        char** pResult;
        int nRow;
        int nCol ,i ,j,index=1;
        int nResult = sqlite3_open("MyTest.db",&db);
        if(nResult)
            printf("can not open database.\n");
        else
            printf("open database succsee.\n");
    
        nResult = sqlite3_exec(db,"create table fuck_U(id integer,name varchar(100))",NULL,NULL,&errmsg);
        if (nResult != SQLITE_OK)
        {
             printf("errmsg = %s\n",errmsg);
            /* sqlite3_close(db);
             sqlite3_free(errmsg);*/
        }
    
        int kk = 0;
      	kk = sprintf(strSql,"insert into fuck_U values(%d,'zhangsan');\n",index);
        for(index = 2;index < 100;index++)
        {
        	kk += sprintf(strSql+kk,"insert into fuck_U values(%d,'zhangsan');\n",index);
        }
        printf("%s",strSql);
        nResult = sqlite3_exec(db,strSql,NULL,NULL,&errmsg);
        if (nResult != SQLITE_OK)
        {
           //sqlite3_close(db);
            printf("errmsg=  %s\n",errmsg);
            //sqlite3_free(errmsg);
            //return 0;
        }
        strSql = "select * from fuck_U";
        nResult = sqlite3_get_table(db,strSql,&pResult,&nRow,&nCol,&errmsg);
        if (nResult != SQLITE_OK)
        {
            sqlite3_close(db);
            printf("errmsg=  %s\n",errmsg);
            sqlite3_free(errmsg);
            return 0;
        }
        printf("nRow= %d\n",nRow);
        printf("nCol= %d\n",nCol);
    
        char strOut[1024];
        int nIndex = nCol;
        int pos = 0;
    
    	printf("hello sqlite db\n");
        for(i=0;i<nRow;i++)
        {
            for(j=0;j<nCol;j++)
            {
            	pos = sprintf(strOut,"%s:",pResult[j]);
            	pos += sprintf(strOut+pos,"%s",pResult[nIndex]);
            	printf("%s\n",strOut);
            	++nIndex;
            }
        }
        sqlite3_free_table(pResult);
        sqlite3_close(db);
        return 0;
    }

    運行結果部分下圖所示

    版權聲明:本文為AlphaGQ原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/AlphaGQ/article/details/104320138

    智能推薦

    SQLite3源碼學習(9)Page Cache概述

            Page cache是進程分配的內存空間,用來緩存數據頁面。page cache的管理獨立于操作系統,當一個線程打開一個數據庫連接時就會建立一個page cache,對于一個進程中的多線程,它們可以有獨立的cache也可以共享一個cahce,下圖描述了page cache的結構: 在Pager初始化時為pPager->pPCa...

    Sqlite3源碼學習(5)OS的接口VFS

        之前講了那么多的環境搭建,現在終于可以學習源碼了。官方有一篇講解VFS的文檔,對理解sqlite3的VFS有很大的幫助: http://www.sqlite.org/vfs.html 1.VFS簡介       VFS也就是所謂的虛擬文件系統,因為sqlite3運行在不同的平臺上會有不同的文件系統,V...

    使用sqlite3的一定總結

    從來沒有接觸過數據庫,因為最近的一個項目接觸了sqlite3,記錄一些經驗總結; 自學參考資料 sqlite3的相關文件,直接放在主程序的目錄內;(這樣不用額外設置路徑,項目小可以這樣做) 設置一下附加依賴項: 方式一:項目屬性—-鏈接器—-輸入—-添加”sqlite3.lib”(根據具體情況,有時需要添加附加庫目錄) 方式二:#prag...

    sqlite3中的一些PRAGMA語句

    1.問題原由 需要修改sqlite的一些配置和數據庫操作,eg. 查詢THREADSAFE等編譯選項。但是用的qt封裝的QSqlDatabase類。無法執行sqlite源碼中的一些原生函數。后面發現可以通過執行PRAGMA的一些語句來達到目的。   2.參考資料和使用方法 最一手的資料當然是官方的資料 https://www.sqlite.org/pragma.html &nb...

    調用sqlite3示例

    這是以靜態鏈接lib方式實現的調用,dll方式待更新 1.從官網下載源碼 https://sqlite.org/download.html 我下載的是:  2.下載后創建.lib靜態庫項目,把解壓后的文件中的3個扔到新建的項目 然后可以直接編譯,但是會報錯。  3.修改項目屬性,改為:不使用編譯頭   然后再重新編譯 4.新建項目sqlite_demo,把s...

    猜你喜歡

    Python SQLite3使用

    運行結果...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡