嵌入式數據庫--SQLite簡單應用

簡介

 嵌入式數據庫實際上是輕量級的,在運行時,它們需要較少的內存。
嵌入式數據庫的一大好處就是在你的程序內部不需要網絡配置,也不需要管理。因爲客戶端和服務器在同一進程空間運行。
SQLite 的數據庫權限只依賴於文件系統,沒有用戶帳戶的概念。SQLite 有數據庫級鎖定,沒有網絡服務器。
它需要的內存,其它開銷很小,適合用於嵌入式設備。你需要做的僅僅是把它正確的編譯到你的程序。
接口由SQLite C API組成,也就是說不管是程序、腳本語言還是庫文件,最終都是通過它與SQLite交互的(我們通常用得較多的ODBC/JDBC最後也會轉化爲相應C API的調用)。

http://www.sqlite.org/download.html
下載sqlite-src-3070900

我們不需要TCL的支持,在編譯時需要把TCL支持disable了
 ./configure –disable-tcl
 make
 生成的庫(動態庫、靜態庫)和可執行程序都在 .libs目錄下


在shell下命令

建一個數據庫

sqlite3 stu.db

進入了sqlite3之後,會看到以下文字:

SQLite version 3.1.3
Enter ".help" for instructions
sqlite> 

建立一個表,名爲stu,有name和num兩個字段,以;分號結束

CREATE TABLE student(name,num);

列出所有的數據表: .tables

.tables

student
顯示數據庫結構:.schema

.schema student

CREATE TABLE student(name,num);

插入幾個數據   insert into table_name values(data1, data2, data3, ...);

insert into stu values('Stevenbai'1,001);
insert into stu values(anjincang,1002);

查詢  基本語法 select columns from table_name where expression;

導出所有數據庫的內容

select * from film;

Stevenbai|1001
anjincang|1002

 

 SQLite編程與應用

打開數據庫
int sqlite3_open(const char *filename, sqlite3 **ppDb); 
第一個參數指文件名
第二個參數則是定義的 sqlite3 ** 結構體指針(關鍵數據結構),稱爲數據庫句柄。
返回值:表示操所是否正確 (SQLITE_OK 操作正常)
說明:打開一個數據庫,文件名不一定要存在,如果此文件不存在,sqlite會自動創建。

關閉數據庫
int sqlite3_close(sqlite3*);
參數就是剛纔的結構體,也就是數據庫句柄。
說明:如果用sqlite3_open開啓了一個數據庫,結尾時不要忘了用這個函數關閉數據庫。

 

執行SQL語句
int sqlite3_exec(sqlite3*,const char *sql,sqlite_callback,void *,char **errmsg);
這個函數的功能是執行一條或者多條SQL語句,SQL語句之間用“;”號隔開。
建議在執行一條或者多條SQL語句得時候,指定第三個參數回調函數,在回調函數中可以獲得執行Sql得詳細過程,如果所有Sql執行完畢則應該返回0,否則,則說明這次執行並沒有完全成功。第五個參數:如果執行失敗(沒有返回0)則可以查看第五個闡述得值。來查看詳細錯誤信息。。
說明:通常sqlite3_callback和它後面的void*這兩個位置都可以填NULL,表示不需要回調。比如您做insert操作,做delete操作,就沒有必要使用回調。而當作select時,就要使用回調,因爲sqlite3把數據查出來,得通過回調告訴你查出了什麼數據。

exec的回調
typedef int (*sqlite3_callback)(void*, int, char**, char**);
例如:int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
para是在 sqlite3_exec 裏傳入的 void * 參數,通過para參數,可以傳入帶有控制功能的數據
n_column是這一條記錄有多少個字段 (即這條記錄有多少列)
char ** column_value 是個關鍵值,查出來的數據都保存在這裏,它實際上是個1維數組,每一個元素都是一個 char * 值,是一個字段內容(用字符串來表示,以\0結尾)
char ** column_name跟column_value是對應的,表示這個字段的字段名稱
說明:回調函數必須定義爲上面這個函數的類型。

 取當前插入位置:
long long int sqlite3_last_insert_rowid(sqlite3*);
返回你前一次插入得位置,從1開始,sqlite3* 爲你打開數據庫所得到得句柄。

非回調select查詢:
int sqlite3_get_table(sqlite3*,const char *sql,char ***resultp,int *nrow,int *ncolumn,char **errmsg);
執行一次查詢Sql 並且返回得到一個記錄集。
說明:第三個參數是查詢結果,它是一維數組,內存佈局爲:第一行是字段名稱,後面是緊接着是每個字段的值。

 

釋放查詢結果:
void sqlite3_free_table(char **result);
釋放當前查詢的記錄集所佔用的內存。

 

  1. #include<stdio.h>  
  2. #include<sqlite3.h>  
  3. #include<string.h>  
  4.   
  5. int printSqlResult(void *para, int column, char **value, char **key)  
  6. {  
  7.     int i;  
  8.     printf("column=%d\n",column);  
  9.     for(i = 0; i < column; i++)  
  10.     {  
  11.         printf("%s\t",*(value+i));  
  12.     }  
  13.     printf("\n");  
  14.     return SQLITE_OK;  
  15. }  
  16. int main(int argc, char *argv[])  
  17. {  
  18.     sqlite3 *pDb;  
  19.     int j, i, pos, row, col, ret;  
  20.     char acCmd[128];  
  21.     char **ppRet;  
  22.   
  23.     if(argc < 2)  
  24.     {  
  25.         printf("please input sql command!");  
  26.         return -1;  
  27.     }  
  28.       
  29.     strcpy(acCmd,argv[1]);  
  30.   
  31.     ret = sqlite3_open("./stu.db",&pDb);  
  32.     if(ret != SQLITE_OK)  
  33.     {  
  34.         printf("open database fail!\n");  
  35.         return -1;  
  36.     }  
  37.   
  38.     ret = sqlite3_exec(pDb, acCmd, printSqlResult, NULL, NULL);  
  39.     {  
  40.         if(ret != SQLITE_OK)  
  41.         {  
  42.             printf("exec fail,ret %d\n", ret);  
  43.             return -1;  
  44.         }  
  45.     }  
  46.     pos = sqlite3_last_insert_rowid(pDb);  
  47.     printf("pos = %d\n",pos);  
  48.   
  49.     sqlite3_get_table(pDb,"select * from stu;",&ppRet,&row,&col,NULL);  
  50.   
  51.     for(i = 0; i <= row; i++)  
  52.     {  
  53.         for(j = 0; j < col; j++)  
  54.         {  
  55.             printf("%s\t",*(ppRet+i*col+j));  
  56.         }  
  57.         printf("\n");  
  58.     }  
  59.     sqlite3_free_table(ppRet);  
  60.     sqlite3_close(pDb);  
  61.     return 0;  
  62. }  


  1. [root@localhost sqlite]# ./sqlite "select * from stu;"  
  2.   
  3. column=2  
  4.   
  5. Stevenbai       1001  
  6.   
  7. column=2  
  8.   
  9. anjincang       1002  
  10.   
  11. pos = 0  
  12.   
  13. name    num  
  14.   
  15. Stevenbai       1001  
  16.   
  17. anjincang       1002  


回調函數打印完一條信息再回調,看column=2打印了兩次就知道。

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