SQLite数据库是一种本地的轻型数据库,在存储一些本地的数据的时候,或者不需要用到Oracle,SQL2008之类的大型数据库的时候,Sqlite的优势就能够得到发挥。程序需要采集数据存储起来,可以使用这个数据库。或者觉得ini文件,txt文件在存储的过程中,数据的组织比较困难可以使用这个数据库。
同时如果是涉及嵌入式系统,SQLite的便捷性能够得到更好的体现。他将所有的方法都包含在了三个文件中:
sqlite3.h
sqlite3.c
sqlite3ext.h
附下载地址:链接:http://pan.baidu.com/s/1qYawfFY 密码:l7fq
地址失效可以私信。
在使用的过程中,最简单的办法是,你可以直接将三个文件全部添加到相应的工程中,在引用头文件之后,你就可以使用其中的方法了。
其中的增删改查可以参考如下代码使用:但是要注意自己应该添加和完善一些功能
sqlite3 *db=NULL; char *zErrMsg = 0; int rc; //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件 rc = sqlite3_open("zsl.db", &db); if( rc ) { CString temp1; temp1.Format(_T("Can’t open database: %s "), sqlite3_errmsg(db)); TRACE(temp1); //fprintf(stderr, "Can’t open database: %s ", sqlite3_errmsg(db)); sqlite3_close(db); return (1); } else TRACE("You have opened a sqlite3 database named zsl.db successfully! "); //创建一个表,如果该表存在,则不创建, //并给出提示信息,存储在zErrMsg 中 char *sql = " CREATE TABLE test(ID INTEGER PRIMARY KEY,AGE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),SALARY REAL);" ; sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); //插入数据 sql = "INSERT INTO "test" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ; sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); int nrow = 0, ncolumn = 0; //查询结果集的行数、列数 char **azResult; //二维数组存放结果 //查询数据 sql = "SELECT * FROM test "; sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg ); int i = 0 ; printf( "row:%d column=%d " , nrow , ncolumn ); printf( " The result of querying is : " ); for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ) printf( "azResult[%d] = %s ", i , azResult[i] ); //删除数据 sql = "DELETE FROM test WHERE AGE = 1 ;" ; sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); //释放掉azResult 的内存空间 sqlite3_free_table( azResult ); sqlite3_close(db); //关闭数据库 int c=getchar(); return 0; }
值得注意的地方,在于在使用sqlite3 的时候,你会发现存储的过程中会出现中文的乱码,那是因为,SQLite3数据库默认的编码格式为UTF-8,所以在使用之前,需要对你的格式进行转换。
以VC++ MFC为例,如果你的程序使用的是默认Unicode编码,那么只需要Unicode->UTF-8的转换,如果你是使用的多字节字符集,那么系统默认的编码格式应该是Ansi,这时候,你需要将编码从Ansi转换到Unicode,然后从Unicode转换到UTF-8。
因为我的工程中使用的多字节,所以我这里先贴出一个Ansi转换为UTF-8的代码:
//Ansi To Utf-8 Utf-8 To Ansi char* *****::AnsiToUtf8(char* stransi) { //Ansi to Unicode int wcsLen = ::MultiByteToWideChar(CP_ACP,NULL,stransi,strlen(stransi),NULL,0); wchar_t* strunicode = new wchar_t[wcsLen+1]; ::MultiByteToWideChar(CP_ACP,NULL,stransi,strlen(stransi),strunicode,wcsLen); strunicode[wcsLen] = '