SQlite3使用

SQLite3 使用

1SQLite官方网站下载SQLite3的源程序,下载地址:
http://www.sqlite.org

2、本文使用下载原码的方式编译并使用,也可下载动态库进行使用

3、将sqlite3.hsqlite3ext.h shell.c加入工程目录

4、使用:在工程下包含sqlite3.h就可以,代码如下

#include <iostream>
#include "sqlite3.h"
using namespace std;

int testdb(void);

int main()
{
	testdb();
	return 0;
}

int testdb(void)

{

	sqlite3 *db=NULL;

	char *zErrMsg = 0;

	int rc;



	//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件

	rc = sqlite3_open("zsl.db", &db);

	if( rc )
	{

		fprintf(stderr, "Can’t open database: %s\n", sqlite3_errmsg(db));

		sqlite3_close(db);

		return (1);
	}
	else
	{
		printf("You have opened a sqlite3 database named zsl.db successfully!\n");
	}

	//创建一个表,如果该表存在,则不创建,

	//并给出提示信息,存储在zErrMsg 中

	//char *sql = " CREATE TABLE test(ID INTEGER PRIMARY KEY,PROVINCE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),HOMEDIS REAL);" ;
	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(1 , 2 , 4 , 'ji', 3.0);" ;

	sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );

	sql = "INSERT INTO \"test\" VALUES(100 , 92 , 84 , 'li', 9.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 \n" , nrow , ncolumn );

	printf( "\nThe result of querying is : \n" );

	for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )

		printf( "azResult[%d] = %s\n", 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); //关闭数据库

	return 0;

}

执行结果:


5、其他

值得注意的地方,在于在使用sqlite3 的时候,你会发现存储的过程中会出现中文的乱码,那是因为,SQLite3数据库默认的编码格式为UTF-8,所以在使用之前,需要对你的格式进行转换。

以VC++ MFC为例,如果你的程序使用的是默认Unicode编码,那么只需要Unicode->UTF-8的转换,如果你是使用的多字节字符集,那么系统默认的编码格式应该是Ansi,这时候,你需要将编码从Ansi转换到Unicode,然后从Unicode转换到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] = '\0';
    //Unicode To UTF-8
    int utf8len = ::WideCharToMultiByte(CP_UTF8,NULL,strunicode,wcslen(strunicode),NULL,0,NULL,NULL);
    char* strutf8 = new char[utf8len+1];
    ::WideCharToMultiByte(CP_UTF8,NULL,strunicode,wcslen(strunicode),strutf8,utf8len,NULL,NULL);
    strutf8[utf8len] = '\0';
    
    delete [] strunicode;
    strunicode = NULL;
    return strutf8;

}
char* ***::Utf8ToAnsi(char* strutf8)
{
    //UTF-8 To Unicode
    
    int wlen = ::MultiByteToWideChar(CP_UTF8,NULL,strutf8,strlen(strutf8),NULL,0);
    wchar_t* strunicode = new wchar_t[wlen+1];
    ::MultiByteToWideChar(CP_UTF8,NULL,strutf8,strlen(strutf8),strunicode,wlen);
    strunicode[wlen] = '\0';
    
    //Unicode To Ansi
    int    ansilen = ::WideCharToMultiByte(CP_ACP,NULL,strunicode,wcslen(strunicode),NULL,0,NULL,NULL);
    char* szAnsi = new char[ansilen+1];
    ::WideCharToMultiByte(CP_ACP,NULL,strunicode,wcslen(strunicode),szAnsi,ansilen,NULL,NULL);
    szAnsi[ansilen] = '\0';
    delete [] strunicode;
    strunicode = NULL;
    return szAnsi;
}

注意这段代码中,使用了2个new,但是只delete了一个,这里需要你在使用完成转换后的字符串,进行手动delete,否则可能造成内存泄漏。

猜你喜欢

转载自blog.csdn.net/u010855021/article/details/75578973