99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

一口Linux
認證:優質創作者
所在專題目錄 查看專題
兩個線程,兩個互斥鎖,怎么形成一個死循環?
Linux庫概念,動態庫和靜態庫的制作,如何移植第三方庫
關于線程調度,你需要了解的幾個基礎知識點都在這里了
從概念到代碼,一文了解Linux系統守護進程知識
如何用C語言操作sqlite3,一文搞懂
linux共享內存入門
作者動態 更多
10種初學者最常見的c語言段錯誤實例及原因分析
1星期前
linux系統監控工具小神器:btop
3星期前
有沒有權貴開后門讓子女做軟件開發人員?
05-10 23:36
一文包你學會網絡數據抓包
03-15 09:26
C語言初學者編程水平上不來?不妨嘗試這10個C語言例子
03-14 20:31

如何用C語言操作sqlite3,一文搞懂

嵌入式數據共3篇,本片是最后一篇。

嵌入式數據庫sqlite3【基礎篇】-基本命令操作,小白一看就懂

嵌入式數據庫sqlite3【進階篇】-子句和函數的使用,小白一文入門

sqlite3編程接口非常多,對于初學者來說,我們暫時只需要掌握常用的幾個函數,其他函數自然就知道如何使用了。

數據庫

本篇假設數據庫為my.db,有數據表student。

nonamescore4一口Linux89.0

創建表格語句如下:

CREATE TABLE  IF NOT EXISTS student (no integer primary key, name text, score real);

常用函數

sqlite3_open

int   sqlite3_open(char  *path,   sqlite3 **db);功能:    打開sqlite數據庫參數:    path: 數據庫文件路徑    db: 指向sqlite句柄的指針,后面對數據庫所有的操作都要依賴這個句柄返回值: 成功返回0,失敗返回錯誤碼(非零值)

sqlite3_close

int   sqlite3_close(sqlite3 *db);功能: 關閉sqlite數據庫返回值: 成功返回0,失敗返回錯誤碼
const  char  *sqlite3_errmsg(sqlite3 *db);功能: 打印錯誤信息        返回值: 返回錯誤信息

不使用回調函數執行SQL語句

sqlite3_get_table

int   sqlite3_get_table(sqlite3 *db, const  char  *sql,  char ***resultp,  int*nrow,  int *ncolumn, char **errmsg);
功能: 執行SQL操作參數: 
db:數據庫句柄 sql:SQL語句 
resultp:用來指向sql執行結果的指針 
nrow:滿足條件的記錄的數目 
ncolumn:每條記錄包含的字段數目 
errmsg:錯誤信息指針的地址
返回值: 成功返回0,失敗返回錯誤碼

舉例

下面比如我們要顯示student表中所有的數據信息,我們就可以利用sqlite3_get_table()執行語句:

select * from student

實現代碼如下:

void do_show_sample(sqlite3 *db)
 {
  char **result, *errmsg;
 int nrow, ncolumn, i, j, index;

 if (sqlite3_get_table(db, "select * from student", &result, &nrow, &ncolumn, &errmsg) != 0)
 {
  printf("error : %s\n", errmsg);
  sqlite3_free(errmsg);
 }
 index = ncolumn;
 for (i=0; i<nrow; i++)
 {
  for (j=0; j<ncolumn; j++)
  {
   printf("%-8s : %-8s\n", result[j], result[index]);   
   index++;
  }
  printf("************************\n");
 }
 sqlite3_free_table(result);
 return;
 }

假定當前的表格的數據信息如下:

 

關于這個函數中出現的這些參數的具體含義,我們可以見下圖:

sqlite3編程接口非常多,對于初學者來說,我們暫時只需要掌握常用的幾個函數,其他函數自然就知道如何使用了。

數據庫

本篇假設數據庫為my.db,有數據表student。

 

創建表格語句如下:

CREATE TABLE  IF NOT EXISTS student (no integer primary key, name text, score real);

常用函數

sqlite3_open

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

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

sqlite3_close

int   sqlite3_close(sqlite3 *db);
功能: 關閉sqlite數據庫      
返回值: 成功返回0,失敗返回錯誤碼
const  char  *sqlite3_errmsg(sqlite3 *db);
功能: 打印錯誤信息        
返回值: 返回錯誤信息

不使用回調函數執行SQL語句

sqlite3_get_table

int   sqlite3_get_table(sqlite3 *db, const  char  *sql,  char ***resultp,  int*nrow,  int *ncolumn, char **errmsg);
功能:
 執行SQL操作
參數:
 db:數據庫句柄
 sql:SQL語句
 resultp:用來指向sql執行結果的指針
 nrow:滿足條件的記錄的數目
 ncolumn:每條記錄包含的字段數目
 errmsg:錯誤信息指針的地址
返回值:
 成功返回0,失敗返回錯誤碼

舉例

下面比如我們要顯示student表中所有的數據信息,我們就可以利用sqlite3_get_table()執行語句:

select * from student

實現代碼如下:

void do_show_sample(sqlite3 *db)
 {
  char **result, *errmsg;
 int nrow, ncolumn, i, j, index;

 if (sqlite3_get_table(db, "select * from student", &result, &nrow, &ncolumn, &errmsg) != 0)
 {
  printf("error : %s\n", errmsg);
  sqlite3_free(errmsg);
 }
 index = ncolumn;
 for (i=0; i<nrow; i++)
 {
  for (j=0; j<ncolumn; j++)
  {
   printf("%-8s : %-8s\n", result[j], result[index]);   
   index++;
  }
  printf("************************\n");
 }
 sqlite3_free_table(result);
 return;
 }

假定當前的表格的數據信息如下:

 

關于這個函數中出現的這些參數的具體含義,我們可以見下圖:

在這里插入圖片描述

由上圖可知:代碼中:

ncolumn = 3nrow    = 5result 指向所有的結果組成的字符串數組,各個具體字符串的下標,圖上已經標明。

結合此圖再去理解代碼,就很容易理解代碼的實現原理。

使用回調函數執行SQL語句

sqlite3_exec

typedef  int (*sqlite3_callback)(void *, int, char **, char **);

int   sqlite3_exec(sqlite3 *db, const  char  *sql,  sqlite3_callback callback, void *,  char **errmsg);
功能:
 執行SQL操作
參數:
 db:數據庫句柄
 sql:SQL語句,就是我們前面兩章用于操作表的增刪改查語句
 callback:回調函數
 errmsg:錯誤信息指針的地址
返回值:
 成功返回0,失敗返回錯誤碼

回調函數

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

舉例

sqlite3 *db;
char  *errmsg,**resultp;

int callback(void *para, int f_num, char **f_val, char **f_name)
{
 int i;

 for (i=0; i<f_num; i++)
 {
  printf("%-8s", f_val[i]);
 }
 printf("\n");

 return 0;
}

void do_show(sqlite3 *db)
{
 char *errmsg;

 printf("no      name    score\n");
 
 if (sqlite3_exec(db, "select * from student", callback, NULL, &errmsg) != 0)
 {
  printf("error : %s\n", sqlite3_errmsg(db));
 }
 printf("\n");

 return;
}

回調函數方法實現的代碼,需要實現一個回調函數:callback。函數sqlite3_exec()在解析命令"select * from student" ,沒獲取到一行數據就會調用一次回調函數, 參考上面的表格student,

callback()總共會被調用5次,
f_num 對應結果的列數,為3
f_value 則指向 每一列對應的值組成的字符串數組

假設現在callback是第四次被調用,如下圖:

運行結果

編譯需要使用第三方庫lsqlite3。

gcc student.c -o run -lsqlite3

其他函數

sqlite3 *pdb, 數據庫句柄,跟文件句柄FILE很類似
sqlite3_stmt *stmt, 這個相當于ODBC的Command對象,用于保存編譯好的SQL語句

sqlite3_exec(), 執行非查詢的sql語句
sqlite3_prepare(), 準備sql語句,執行select語句或者要使用parameter bind時,用這個函數(封裝了sqlite3_exec)
Sqlite3_step(), 在調用sqlite3_prepare后,使用這個函數在記錄集中移動

還有一系列的函數,用于從記錄集字段中獲取數據,如

sqlite3_column_text(), 取text類型的數據
sqlite3_column_blob(),取blob類型的數據
sqlite3_column_int(), 取int類型的數據

國際慣例,上完整代碼:

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

void do_insert(sqlite3 *db)
{
 int no;
 char name[16];
 float score;
 char sqlstr[128], *errmsg;

 printf("input no : ");
 scanf("%d", &no);
 printf("input name : ");
 scanf("%s", name);
 printf("input score : ");
 scanf("%f", &score);
 sprintf(sqlstr, "insert into student values (%d, '%s', %.1f)", 
 no, name, score);
 #if __DEBUG
 printf("cmd:%s\n",sqlstr);
 #endif
 if (sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg) != 0)
 {
  printf("error : %s\n", sqlite3_errmsg(db));
 }
 else
 {
  printf("insert is done\n");
 }
 printf("\n");

 return;
}

void do_delete(sqlite3 *db)
{
 char *errmsg;
 char sqlstr[128], expression[64];

 printf("input expression : ");
 scanf("%s", expression);//name='ma'
 sprintf(sqlstr, "delete from student where %s", expression);
#if __DEBUG
 printf("cmd:%s\n",sqlstr);
#endif
 if (sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg) != 0)
 {
  printf("error : %s\n", sqlite3_errmsg(db));
 }
 else
 {
  printf("deletet is done\n");
 }
 printf("\n");

 return;
}
 
int callback(void *para, int f_num, char **f_val, char **f_name)
{
 int i;

 for (i=0; i<f_num; i++)
 {
  printf("%-8s", f_val[i]);
 }
 printf("\n");

 return 0;
}

void do_show(sqlite3 *db)
{
 char *errmsg;

 printf("no      name    score\n");

 if (sqlite3_exec(db, "select * from student", callback, NULL, &errmsg) != 0)
 {
  printf("error : %s\n", sqlite3_errmsg(db));
 }
 printf("\n");

 return;
}

 void do_show_sample(sqlite3 *db)
 {
  char **result, *errmsg;
 int nrow, ncolumn, i, j, index;

 if (sqlite3_get_table(db, "select * from student", &result, &nrow, &ncolumn, &errmsg) != 0)
 {
  printf("error : %s\n", errmsg);
  sqlite3_free(errmsg);
 }
 
 index = ncolumn;

 for (i=0; i<nrow; i++)
 {
  for (j=0; j<ncolumn; j++)
  {
   printf("%-8s : %-8s\n", result[j], result[index]);
   
    
   index++;
  }
  printf("************************\n");
 }
 sqlite3_free_table(result);

 return;
 }
 

int main()
{
 sqlite3 *db;
 int n;
 char clean[64];

 if (sqlite3_open("my.db", &db) < 0)
 {
  printf("fail to sqlite3_open : %s\n", sqlite3_errmsg(db));
  return -1;
 }

 while ( 1 )
 {
  printf("*********************************************\n");
  printf("1: insert record   \n2: delete record  \n3: show record  \n4: quit\n");
  printf("*********************************************\n");
  printf("please select : "); 
  
  if (scanf("%d", &n) != 1)
  {
   fgets(clean, 64, stdin);
   printf("\n");
   continue;
  }
  switch ( n )
  {
   case 1 :
    do_insert(db);
    break;
   case 2 :
    do_delete(db);
    break;
   case 3 :
    do_show_sample(db);
    break;
   case 4 :
    sqlite3_close(db);
    exit(0);
  }
 }
 return 0;
}

運行主頁面:

插入記錄:

顯示記錄:

刪除記錄:

 

End

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 3
關注 181
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 久久久久久中文 | 久久女人精品 | 性色av浪潮av | 欧美精品91| 亚洲欧美日韩专区 | 欧美精品一区二区久久久 | 成人国产一区 | 中文字幕一区二区日韩精品绯色 | 国产亚洲综合一区柠檬导航 | 天堂资源在线观看免费高清视频 | 中文字幕在线中文 | 亚洲韩国一区二区三区 | 日韩人妻无码AV一区二区三区 | 久久艹一区 | 在线三级av| 可以免费看的av毛片 | a4yy私人毛片| 日韩一区二区三区四区在线 | 免费亚洲视频在线观看 | 亚洲理论av | 2020久久超碰国产精品最新 | 日韩欧美在线第一页 | 992tv国产精品福利在线 | 无码精品A∨在线观看中文 国产午夜精品片一区二区三区 | 欧洲精品色在线观看 | 成人性生交大片免费看中国A片 | 久久精品中文字幕一区二区三区 | 国产成人涩涩涩视频在线观看 | 国产瑟瑟视频 | 天天草网站 | 国产精品久久久久久久亚洲按摩 | CHINESEMATURE老女熟 | 中文字幕在线看 | 毛片久久一区二区三区网站 | 国产伦理精品一区二区三区观看体验| 日韩精品免费一区二区三区竹菊 | 一区二三区日韩精品 | 亚洲精品无码久久久久SM | 久久精品亚洲精品艾草网 | 91视频污免费 | 国内在线一区 |