sqlite3數據庫的基本使用及API函數介紹

It is also important to develop organized thinking and learning to think of different things one by one in order.--------培養清晰有條理的思考習慣,學會依次考慮不同的事情,也是很重要的。

1,sqlite簡介

SQLite 是一款輕量級的關係型數據庫,同時也是一種嵌入式數據庫,與 Oracle、MySQL、SQL Server 等數據庫不同,它可以內嵌在程序中,是程序中的一個組成部分。

特點爲佔用資源少,管理簡單,操作簡單,生成的數據庫文件很容易與各個平臺兼容

2,sqlite3數據庫的安裝

2.1本地安裝

sudo dpkg -i *.deb

2.2 在線安裝

sudo apt-get install sqlite3
sudo apt-get install sqlite3 libsqlite3-dev

2.3 創建新的數據庫

sqlite3 student.db //這個命令後就可以在sqlite3提示符下進行數據庫操作了

3 ,sqlite3的基本命令

3.1 系統命令

以‘.’開頭的命令叫做系統命令,例如常用的有,
.help 幫助
.quit 退出
.exit 退出
.schema 查看錶的結構圖,相當於查看錶格的第一行
.table 查看已有的表格
.databases 查看數據庫信息

3.2 sql命令(除了系統命令,下面的命令都要以;結尾)

  • 創建一張新的數據庫表stu

creat table stu(id Interger,name char,score Interger);//必須以分號結尾,下面的也是

  • 插入全部記錄

insert into stu values(1001,‘zhangshan’,47);

  • 插入部分記錄

insert into stu (name,score)values(‘xuxinhua’,90);


  • 查詢全部插入的記錄

select * from stu;

  • 查詢部分字段

select name,score from stu;

  • 條件查詢

select * from stu where score=90 and id=1001;//同時滿足
select * from stu where score=90 or id=1001;//或者滿足


  • 刪除一條記錄

delete from stu where name=‘xuxinhua’;

  • 更新一條記錄

update stu set name=‘xuxinhua’,score=90 where id=1001;


  • 添加一列

alter table stu add clomn address char;


  • 選擇舊錶中指定的列然後創建一張新的表格

create table stu1 as select id,name,score from stu;

  • 刪除一張表

drop table stu;

  • 改變一張表格的名字

alter table stu1 rename to stu;

4,sqlite API函數

4.1 打開數據庫sqlite3_open()

int sqlite3_open(char *path, sqlite3 **ppDb);

功能:打開slite3 數據庫
path:數據庫文件路徑
db:指向數據庫句柄的指針
返回值:成功返回SQLITE_OK,失敗返回錯誤碼(非零值)

4.2 關閉數據庫sqlite3_close()

int sqlite3_close(sqlite3*   ppDb);

關閉數據庫

4.3 獲取錯誤碼sqlite3_errmsg()

const char *sqlite3_errmsg(sqlite3*ppDb);

函數功能:獲取數據庫操作錯誤時的錯誤碼

4.4 執行sql命令sqlite3_exec()

int sqlite3_exec(
	  sqlite3* ppDb,                             
      /* An open database */
	  const char *sql,                          
      /* SQL to be evaluated */
	  int (*callback)(void* arg,int,char**,char**),
      /* Callback function */
	  void * arg,       
      /* 1st argument to callback */
	  char **errmsg      
      /* Error msg written here */
	);

函數功能:執行sql指定的數據庫命令操作。
參數說明
ppDb:splite3_open操作時的第二個參數dB數據操作句柄
sql:SQL命令,可以有多條命令組成
callback:執行完該函數的回調函數,只有sql爲查詢語句的時候纔會執行此語句。
void * arg: 作爲callback回調函數的第一個參數傳入
errmsg:獲取函數錯誤是的錯誤碼

  • 回調函數
int sqlite_callback(
  void*      para, 
  int         f_num, 
  char**    f_value, 
  char**    f_name
); 

說明:每找到一條記錄自動執行一次回調函數
para:傳遞給回調函數的參數
f_num:記錄中包含的字段數目
f_value:包含每個字段值的指針數組
f_name:包含每個字段名稱的指針數組
返回值:成功返回0,失敗返回-1

sqlite3_get_table()

int sqlite3_get_table(
	  sqlite3 *ppDb,          
      /* An open database */
	  const char *zSql,     
      /* SQL to be evaluated */
	  char ***dbResult,     
      /* 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 */
	);

函數功能:獲取數據庫表格
函數參數
ppDb:同上
zSql:SQL命令
dbResult:查詢結果,它依然是一維數組,它內存佈局是:字段名稱,後面是緊接着是每個字段的值。
pnRow:查出具體有多少行,即多少條記錄(不包括字段名那行)。
pnColumn:查出具體有多少列,即多少字段
pzErrmsg:錯誤信息

5, 例子代碼

下面給出簡單例子
需要注意:編譯的時候加-lsqlite3

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

int main(int argc, char *argv[])
{
        sqlite3 * db;
        char *errmsg;

        if(sqlite3_open("./student.db", &db) != SQLITE_OK)
        {
                printf("%s\n",sqlite3_errmsg(db));
                return -1;
        }
        else
        {
                printf("open student.db success\n");
        }


        if(sqlite3_exec(db, "create table xuxinhua (name char);", NULL, NULL, &errmsg) != SQLITE_OK)
        {
                 printf("%s\n",errmsg);
        }
                printf("table success\n");
        
        
        sqlite3_close(db);
        return 0;
}

6, 綜合性代碼

下面我們編寫一個使用程序完成數據庫操作

/*********************************************************************************
 *      Copyright:  (C) 2020 lingyun
 *                  All rights reserved.
 *
 *       Filename:  sqlite3.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2020年02月27日)
 *         Author:  xuxinhua <[4~[D[4~xxu>
 *      ChangeLog:  1, Release initial version on "2020年02月27日 14時36分31秒"
 *                 
 ********************************************************************************/
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>


#define table_name "stu.db"

//用於添加新一行的函數
int do_insert(sqlite3 * db)
{
    int          id;
    char        name[32]= {};
    int          score;
    char        sql[128] = {};
    char        *errmsg;

    printf("input id:");
    scanf("%d", &id);
    getchar();

    printf("input name:");
    scanf("%s", name);
    getchar();

    printf("input score:");
    scanf("%d", &score);
    getchar();

    sprintf(sql, "insert into firstclass values(%d,'%s', %d);", id, name, score);

    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) 
    {
        printf("%s\n", errmsg);   
    }
    else 
    {
        printf("insert done.\n");
    }

    return 0;
}

//回調函數
int callback(void *para, int f_num, char **f_value, char **f_name)
{

    int i = 0;
    for (i = 0; i < f_num; i++)
    {
        printf("%-11s", f_value[i]);    
    }
    putchar(10);
    return 0;
}



//用於查詢的函數
int do_query(sqlite3 * db)
{
    char sql[128] = {};
    char *errmsg;
    sprintf(sql, "select * from firstclass;");
     if(sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n", errmsg);
    }
    else
    {
        printf("query done.\n");
    }

    return 0;

}


//用於刪除行的函數 
int do_delete(sqlite3 * db)
{
    int         id;
    char        name[32] = {};
    int         score;
    char        sql[128] = {};
    char        *errmsg;

    printf("input id:");
    scanf("%d", &id);
    getchar();


    sprintf(sql, "delete from firstclass where id=%d;", id);

    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n", errmsg);
    }
    else
    {
        printf("delete done.\n");
    }

    return 0;
}
    
    
 //用來跟新行的函數
int  do_update(sqlite3 * db)
{
    int          id;
    int          score;
    char         sql[128] = {};
    char         *errmsg;
    char         name[32] = {};
    printf("input update id:");
    scanf("%d", &id);
    getchar();


    printf("input update score:");
    scanf("%d", &score);
    getchar();

    sprintf(sql, "update firstclass set score =%d where id = %d;",  score, id);

    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s\n", errmsg);
    }
    else
    {
        printf("update done.\n");
    }

    return 0;
}



//主函數
int main(int argc, char *argv[])
{
    sqlite3     *db;
    char        *errmsg;
    int         cmd;

    if(sqlite3_open(table_name, &db) != SQLITE_OK) 
    {
            printf("%s\n",sqlite3_errmsg(db));    
            return -1;
    } 
    else 
    {
            printf("open table_name success\n");   
    }

//CREATE NEW TABLE
    if(sqlite3_exec(db, "create table firstclass (id Integer, name char,  score Integer);", NULL, NULL, &errmsg) != SQLITE_OK) 
    {
            printf("%s\n",errmsg);   
    }
    printf("create table success\n");




    while (1) 
    {
        printf("********************\n");
        printf("1:insert 2:delete 3:query 4:update 5:quit\n");
        printf("********************\n");
        
        scanf("%d", &cmd);
        getchar();

        switch (cmd) 
        {
            case 1:
                do_insert(db);
                break;
            case 2:
                do_delete(db);
                break;
            case 3:
                do_query(db);
                break;
            case 4:
                do_update(db);
                break;
            case 5:
                sqlite3_close(db);
                exit(0);
            default:
                printf("Error cmd.\n");
                
        }
    }
    return 0;
}
  • 這個代碼我們創建stu.db的數據庫,並創建第一個班級的成績表

  • 下面是演示:

先插入三個學生a,b,c

在這裏插入圖片描述

  • 然後刪除學生a
    在這裏插入圖片描述

  • 然後跟新學生b成績
    在這裏插入圖片描述

  • 最後退出

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章