sqlite3使用[Symanli 原创]
sqlite3 是一款小型而且使用简单的数据库,可以前期开发SQLITE3开发者,给我提供了很多相关的接口,这东西虽然小,但用处可以是无处不在呀,现在很多大型的软件都使用了,包括腾讯QQ,金山杀毒,等等。。他的使用方法在网上都能查的到。但为了大家使用方便。我对其进行了简单封装,调用更加方便。

具体请看代码:
//sqliteEx.h
//sqliteEx.h
#pragma once
#include "sqlite3.h"
#ifdef SQLITEXE_H
#endif SQLITEXE_H
#pragma comment(lib,"sqlite3.lib")
class sqliteEx
{
public:
sqliteEx(void);
public:
~sqliteEx(void);
public:
int ret;
sqlite3 * db;
int blsql;
char * errmsg;
public:
int sqlConnection(const char *sDb);
int sqlexecutecmd(const char *ssql,...);
int sqlexecutecmd(const char *ssql,int (*sqlcallback)(void*,int,char**,char**));
int sqlexecutecmd(const char *ssql, char ***resultp, int *nrow, int *ncolumn );
};
//sqliteEx.cpp
//sqliteEx.cpp
#include "StdAfx.h"
#include "sqliteEx.h"
sqliteEx::sqliteEx(void)
{
ret = 0;
db = 0;
blsql = 0;
errmsg = 0;
}
sqliteEx::~sqliteEx(void)
{
sqlite3_close(db);
sqlite3_free(errmsg);
db = 0;
}
int sqliteEx::sqlConnection(const char *sDb)
{
try
{
char sDbname[100]= "\0";
memcpy(sDbname,sDb,sizeof(sDb));
strcat(sDbname,".db");
ret = sqlite3_open(sDbname,&db);
if ( ret == SQLITE_OK ){
blsql = 1;
return blsql;
}
}
catch (...)
{
fprintf(stderr, "无法打开数据库: %s", sqlite3_errmsg(db));
}
}
//CString sql;
//sql.Format("create table %s(urlid varchar(20) PRIMARY KEY, urladd varchar(200),urlll int,urlsta int, birthday datetime);",stable);
int sqliteEx::sqlexecutecmd(const char *ssql,...)
{
try
{
if (blsql){
int result =sqlite3_exec( db, ssql, 0, 0, &errmsg );
if ( result != SQLITE_OK )
{
fprintf(stderr, "sql error: %s\n", errmsg);
sqlite3_free(errmsg);
return 0;
}
return 1;
}
}
catch (...)
{
fprintf(stderr, "sql error: %s\n", errmsg);
return 0;
}
}
/********************************************************************
回调函数放在类中因为类有个隐式的this,所以要设为static
typedef int (*sqlite3_callback)(void*,int,char**, char**);
para是你在 sqlite3_exec 里传入的 void * 参数
通过para参数,你可以传入一些特殊的指针(比如类指针、结构指针),
然后在这里面强制转换成对应的类型(这里面是void*类型,必须强制转换成你的类型才可用)。然后操作这些数据
n_column是这一条记录有多少个字段 (即这条记录有多少列)
char ** column_value 是个关键值,查出来的数据都保存在这里,它实际上是个1维数组(不要以为是2维数组),
每一个元素都是一个 char * 值,是一个字段内容(用字符串来表示,以\0结尾)
char ** column_name 跟 column_value是对应的,表示这个字段的字段名称
*********************************************************************/
int sqliteEx::sqlexecutecmd(const char *ssql,int (*sqlcallback)(void*,int,char**,char**))
{
try
{
if (blsql){
int result = sqlite3_exec( db, ssql, sqlcallback, 0, &errmsg );
if ( result != SQLITE_OK )
{
fprintf(stderr, "sql error: %s\n", errmsg);
sqlite3_free(errmsg);
return 0;
}
return 1;
}
}
catch (...)
{
fprintf(stderr, "sql error: %s\n", errmsg);
return 0;
}
}
/************************************************************************/
/*1.ssql sql语句
2.resultp 查询结果,一维数组,不是其他维数组
3.nrow 结果行数
4 ncolumn 多少列
*/
/************************************************************************/
int sqliteEx::sqlexecutecmd(const char *ssql, char ***resultp, int *nrow, int *ncolumn )
{
//sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg )
try
{
if (blsql){
int result =sqlite3_get_table( db, ssql, resultp, nrow, ncolumn,&errmsg );
if ( result != SQLITE_OK )
{
fprintf(stderr, "sql error: %s\n", errmsg);
sqlite3_free(errmsg);
return 0;
}
return 1;
}
}
catch (...)
{
fprintf(stderr, "sql error: %s\n", errmsg);
return 0;
}
}
//调用代码如下:
void CDemoDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString sql =_T("");
GetDlgItem(IDC_EDIT1)->GetWindowText(sql);
bool blok =sqlite.sqlConnection("test");//创建数据表文件
if(blok)
{
sqlite.sqlexecutecmd(sql);//创建表
}
}
void CDemoDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CString sql,sTest;
static int i=0;
GetDlgItem(IDC_EDIT2)->GetWindowText(sTest);
sql.Format("insert into tstdb values(%d,'%s');",i++,sTest);
sqlite.sqlexecutecmd(sql);
}
void CDemoDlg::OnButton3()
{
// TODO: Add your control notification handler code here
const char *sql = "select * from tstdb;";
//会调用他的回调函数_sql_callback
sqlite.sqlexecutecmd(sql,_sql_callback);
}
//注意是静态成员,否则会和this指针混淆
int CDemoDlg::_sql_callback( void * para, int n_column, char ** column_value, char ** column_name )
{
CString szValue;
for( int i = 0 ; i < n_column; i ++ )
{
szValue.Format("字段名:[%s] 字段值:[%s]\n", column_name[i], column_value[i] );
AfxMessageBox(szValue);
}
return 0;
}

这个例子我就不贴出来了。在VC驿站我已经传上去,大家到上面去下载吧:地址:http://www.cctry.com/thread-40396-1-1.html

浙公网安备 33010602011771号