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

posted @ 2011-09-11 22:39  lpbolg  阅读(195)  评论(0)    收藏  举报