近我正在Linux平臺(tái)寫(xiě)一個(gè)軟件,需要用到一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)。mysql做數(shù)據(jù)庫(kù)固然很好,但其數(shù)據(jù)是存放在服務(wù)器的。我想要的基本功能也就是使用C程序創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)本地文件,然后可以對(duì)這個(gè)數(shù)據(jù)庫(kù)文件執(zhí)行基本的sql操作. 就像在Windows平臺(tái)基于VC6.0的DAO數(shù)據(jù)庫(kù)編程一樣(創(chuàng)建一個(gè)本地文件.mdb).
從網(wǎng)上找到了一個(gè)開(kāi)源免費(fèi)的數(shù)據(jù)庫(kù)開(kāi)發(fā)工具--sqlite, 網(wǎng)上的關(guān)于sqlite的介紹有很多,詳細(xì)見(jiàn)官方網(wǎng)站:http://www.sqlite.com.cn/ . 我發(fā)現(xiàn)sqlite正是我需要的. 總結(jié)一下幾個(gè)特點(diǎn):-
1. 開(kāi)放源代碼
2. 程序特別小,在windows下應(yīng)用程序sqlite.exe僅僅200kb以內(nèi)。
3. 支持大多數(shù)sql指令,速度極快
4. 直接創(chuàng)建一個(gè)xxx.db, 就是一個(gè)數(shù)據(jù)庫(kù),不需要服務(wù)器支持
5. 簡(jiǎn)潔的C語(yǔ)言API接口
基于上面幾點(diǎn),足可以看出sqlite的強(qiáng)大和優(yōu)異之處。源代碼公開(kāi)和程序特別小,甚至可以跨平臺(tái)直接編譯"gcc -o sqlite3 *",將這融合到潛入式系統(tǒng)是多么的美妙!
在Ubuntu6.10平臺(tái)安裝sqlite3及其開(kāi)發(fā)包:
#sudo apt-get install sqlite3 libsqlite3-dev
鏈接這篇文章介紹了sqlite的使用方法:
http://www.sqlite.com.cn/MySqlite/4/378.Html
下面是我總結(jié)的sqlite3與C接口的API
我用到的主要是下面幾個(gè)函數(shù)(頭文件sqlite3.h):
int sqlite3_open(const char*, sqlite3**); //打開(kāi)一個(gè)數(shù)據(jù)庫(kù)
int sqlite3_close(sqlite3*); //關(guān)閉
int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);//執(zhí)行
int sqlite3_get_table(sqlite3*, const char *sql,char***result, int *nrow,int *ncolumn ,char **errmsg );
//result中是以數(shù)組的形式存放所查詢的數(shù)據(jù),首先是表名,再是數(shù)據(jù);
//nrow/ncolumn分別為查詢語(yǔ)句返回的結(jié)果集的行數(shù)/列數(shù),沒(méi)有查到結(jié)果時(shí)返回0
sqlite3_errcode() 通常用來(lái)獲取最近調(diào)用的API接口返回的錯(cuò)誤代碼.
sqlite3_errmsg() 則用來(lái)得到這些錯(cuò)誤代碼所對(duì)應(yīng)的文字說(shuō)明.
exec錯(cuò)誤碼
#define SQLITE_OK 0 /* Successful result */
#define SQLITE_ERROR 1 /* SQL error or missing database */
#define SQLITE_INTERNAL 2 /* An internal logic error in SQLite */
#define SQLITE_PERM 3 /* Access permission denied */
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
#define SQLITE_BUSY 5 /* The database file is locked */
#define SQLITE_LOCKED 6 /* A table in the database is locked */
#define SQLITE_NOMEM 7 /* A malloc() failed */
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite_interrupt() */
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
#define SQLITE_NOTFOUND 12 /* (Internal Only) Table or record not found */
#define SQLITE_FULL 13 /* Insertion failed because database is full */
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
#define SQLITE_EMPTY 16 /* (Internal Only) Database table is empty */
#define SQLITE_SCHEMA 17 /* The database schema changed */
#define SQLITE_TOOBIG 18 /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT 19 /* Abort due to contraint violation */
#define SQLITE_MISMATCH 20 /* Data type mismatch */
#define SQLITE_MISUSE 21 /* Library used incorrectly */
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
#define SQLITE_AUTH 23 /* Authorization denied */
#define SQLITE_ROW 100 /* sqlite_step() has another row ready */
#define SQLITE_DONE 101 /* sqlite_step() has finished executing */
應(yīng)用實(shí)例:
定義
sqlite3 *db = NULL;
char * errMsg = NULL;
char sql_cmd[200];
打開(kāi)文件:
int rc = sqlite3_open("xxx.db", &db);
if(rc) //打開(kāi)失敗
printf("Open database failed!\n");
else
printf("create the database successful!\n");
建立表格:
sprintf(sql_cmd,"CREATE TABLE datapro(package INTEGER,offset \
INTEGER,lklen INTEGER,base INTEHER,link INTEGER,err INTEGER);");
rc=sqlite3_exec(db,sql_cmd,0,0,&eMsg); //建立表datapro
if(rc==SQLITE_OK) //建表成功
printf("create the chn_to_eng table successful!\n");
else
printf("%s\n",eMsg);
添加數(shù)據(jù):
sprintf(sql_cmd,"INSERT INTO datapro VALUES(%d,%d,%d,%d,%d,%d);",4,2345,268,9,3,3);
rc=sqlite3_exec(pro_db,pro_sqlcmd,0,0,&eMsg);
查詢:
int nrow=0, ncolumn=0;
char **azResult; //存放結(jié)果
sql="SELECT * FROM datapro";
sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&eMsg);
//其中nrow為行數(shù),ncolum為列數(shù)
printf("\nThe result of querying is : \n");
for(int i=1;i<nrow+1;i++)
{
for(int j=0;j<ncolumn;j++)
printf("%s ",azResult[i*ncolumn+j]);
printf("\n");
}
刪除:
sprintf(sql_cmd,"DELETE FROM datapro WHERE package=1;") ;
rc=sqlite3_exec(db,sql,0,0,&eMsg); 本文出自:億恩科技【www.riomediacenter.com】
服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|