簡介
嵌入式數據庫實際上是輕量級的,在運行時,它們需要較少的內存。
嵌入式數據庫的一大好處就是在你的程序內部不需要網絡配置,也不需要管理。因爲客戶端和服務器在同一進程空間運行。
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);
釋放當前查詢的記錄集所佔用的內存。
- #include<stdio.h>
- #include<sqlite3.h>
- #include<string.h>
- int printSqlResult(void *para, int column, char **value, char **key)
- {
- int i;
- printf("column=%d\n",column);
- for(i = 0; i < column; i++)
- {
- printf("%s\t",*(value+i));
- }
- printf("\n");
- return SQLITE_OK;
- }
- int main(int argc, char *argv[])
- {
- sqlite3 *pDb;
- int j, i, pos, row, col, ret;
- char acCmd[128];
- char **ppRet;
- if(argc < 2)
- {
- printf("please input sql command!");
- return -1;
- }
- strcpy(acCmd,argv[1]);
- ret = sqlite3_open("./stu.db",&pDb);
- if(ret != SQLITE_OK)
- {
- printf("open database fail!\n");
- return -1;
- }
- ret = sqlite3_exec(pDb, acCmd, printSqlResult, NULL, NULL);
- {
- if(ret != SQLITE_OK)
- {
- printf("exec fail,ret %d\n", ret);
- return -1;
- }
- }
- pos = sqlite3_last_insert_rowid(pDb);
- printf("pos = %d\n",pos);
- sqlite3_get_table(pDb,"select * from stu;",&ppRet,&row,&col,NULL);
- for(i = 0; i <= row; i++)
- {
- for(j = 0; j < col; j++)
- {
- printf("%s\t",*(ppRet+i*col+j));
- }
- printf("\n");
- }
- sqlite3_free_table(ppRet);
- sqlite3_close(pDb);
- return 0;
- }
- [root@localhost sqlite]# ./sqlite "select * from stu;"
- column=2
- Stevenbai 1001
- column=2
- anjincang 1002
- pos = 0
- name num
- Stevenbai 1001
- anjincang 1002
回調函數打印完一條信息再回調,看column=2打印了兩次就知道。