ubuntu上使用sqlite3

crazy_baoli發表於2018-12-01

Ubuntu版本:ubuntu-gnome-16.04-desktop-amd64,gnome版

sqlie:sqlite3

-----------------------------------------------------------------------------------

 

1. 安裝

1.1 下載原始碼

https://www.sqlite.org/download.html

1.2 編譯安裝

1) ./configure

2) ./make

3) ./make install

注:如果用apt-get install sqlite3進行安裝,只會安裝bin檔案,不會安裝庫、標頭檔案等。

1.3 檢視是否安裝成功: sqlite3 --version

 

2. 測試

以下demo實現了:建立資料庫、建立表格、插入資料、查詢資料、刪除資料

gcc -o sqlite-test sqlite-test.c -lsqlite3

注:連結加上-lsqlite3

 

3. 程式碼

// by baoli
// 2017.05.15

#include <stdio.h>  
#include <stdlib.h>  
#include <sqlite3.h>  

#define _DEBUG_  

int main( void )  
{  
    sqlite3 *db = NULL;  
    char *zErrMsg = 0;  
    int rc;  

    rc = sqlite3_open("test.db", &db); //開啟指定的資料庫檔案,如果不存在將建立一個同名的資料庫檔案  
    if( rc )  
    {  
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));  
        sqlite3_close(db);  
        exit(1);  
    }  
    else 
        printf("\nYou have opened a sqlite3 database named test.db successfully!\n\n");  

    //建立一個表,如果該表存在,則不建立,並給出提示資訊,儲存在 zErrMsg 中  
    char *sql = "CREATE TABLE SensorData(ID INTEGER PRIMARY KEY, SensorID INTEGER, SiteNum INTEGER, Time VARCHAR(12), SensorParameter REAL );" ;  

    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  
    #ifdef _DEBUG_  
        if(zErrMsg != NULL) printf("zErrMsg = %s \n", zErrMsg);  
    #endif   

    //插入資料   
    sql = "INSERT INTO \"SensorData\" VALUES(NULL , 11 ,  1 , '201705011206', 18.9 );" ;  
    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  

    sql = "INSERT INTO \"SensorData\" VALUES(NULL , 23 , 45 , '201705011306', 16.4 );" ;  
    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  

    sql = "INSERT INTO \"SensorData\" VALUES(NULL , 34 , 45 , '201705011306', 15.4 );" ;  
    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  


    int nrow = 0, ncolumn = 0;  
    char **azResult; //二維陣列存放結果  

    //查詢資料  
    /* 
    int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg ); 
    result中是以陣列的形式存放你所查詢的資料,首先是表名,再是資料。 
    nrow ,ncolumn分別為查詢語句返回的結果集的行數,列數,沒有查到結果時返回0 
    */  
   
    //查詢資料  
    sql = "SELECT * FROM SensorData ";  
    sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );  
    #ifdef _DEBUG_  
        if(zErrMsg != NULL) printf("zErrMsg = %s \n", zErrMsg);  
    #endif 
    int i = 0 ,j = 0, k = 0  ;
    printf( "row=%d column=%d \n" , nrow , ncolumn );  
    printf( "The result of query is : \n" );  
    // for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )  
    //     printf( "azResult[%d] = %s\n", i , azResult[i] );  
    for(i = 0; i < nrow + 1; i++)
    {
        for(j = 0; j < ncolumn; j ++)
        {
            printf("%-15s  ", azResult[k++]);
        }

        printf("\n");
    }
    k = 0;

    //刪除資料  
    sql = "DELETE FROM SensorData WHERE SensorID = 11 ;" ;  
    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );  
    #ifdef _DEBUG_  
        if(zErrMsg != NULL) printf("zErrMsg = %s \n", zErrMsg);  
    #endif  

    sql = "SELECT * FROM SensorData ";  
    sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );  
    printf( "\n\nrow=%d column=%d " , nrow , ncolumn );  
    printf( "\nAfter deleting , the result of querying is :\n" );  
    for(i = 0; i < nrow + 1; i++)
    {
        for(j = 0; j < ncolumn; j ++)
        {
            printf("%-15s  ", azResult[k++]);
        }

        printf("\n");
    } 
    k = 0;

    //釋放掉  azResult 的記憶體空間  
    sqlite3_free_table( azResult );  

    #ifdef _DEBUG_  
        if(zErrMsg != NULL) printf("zErrMsg = %s \n", zErrMsg);  
    #endif  

    sqlite3_close(db); //關閉資料庫  
    return 0;  

}  

 

相關文章