注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

多多的爹

 
 
 

日志

 
 

MFC到wxWidgets移植笔记(9)——数据库访问  

2008-05-13 13:42:56|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

sqlite3提供了一套C代码,用来访问sqlite3数据。这套代码包含了三个文件,sqlite3.h,sqlite3.c以及sqlite3ext.h。我将sqlite3的源代码放到整个工程中,因此用不上sqlite3ext.h。我们只需要在工程中加入sqlite3.h和sqlite3.c就行了。

前面说过sqlite3的内部完全是二进制,我们可以仅管把所有读取的数据当作二进制看待。因此,只要把中文全部转换成UTF8,这样就能完美的解决中文读取和存储的问题了。

下面是一些常用到的函数:

1.打开关闭数据库:

SQLITE_API int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

SQLITE_API int sqlite3_close(sqlite3 *);

sqlite3_open的第二个参数返回sqlite3*的指针。这个指针指向了一个sqlite3的对象,我们不用关注它的具体内容是什么,就当成一个Windows系统中的句柄就行了。

sqlite3的函数通常都返回一个int表示函数执行结果,一般来说返回SQLITE_OK,也就是0,就表示成功了。

2.执行一个命令

SQLITE_API int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluted */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

基本上,所有的sql操作都是通过这条语句来执行的,以下是一个例子,只处理那种非查询的sql语句:

extern sqlite3* sqlite3DB;

bool DBDatabase::Execute(const wxString& sql)

{

    char* errMsg = NULL;
    bool ret = (SQLITE_OK == sqlite3_exec(sqlite3DB, sql.ToUTF8(), NULL, NULL, &errMsg));
    if (errMsg != NULL)
    {
        if (! ret)
        {
            m_err = wxString::From8BitData(errMsg);
            m_err += wxT("\r\n");
        }
        sqlite3_free(errMsg);
    }
    return ret;

}

当处理非查询sql语句时,sqlite3_exec的第三、四个参数为空。

注意,如果执行结果有错,错误信息保存在errMsg中,这段内存需要通过sqlite3_free释放,否则有内存泄露的问题。

3.事务操作

非常简单,看代码:

void DBDatabase::BeginTrans()
{
    Execute(wxString(wxT("begin transaction")));
}

void DBDatabase::CommitTrans()
{
    Execute(wxString(wxT("commit transaction")));
}

void DBDatabase::RollbackTrans()
{
    Execute(wxString(wxT("rollback transaction")));
}

4.查询操作

当执行“select”语句时,需要为sqlite3_exec的第三个参数指定一个回调函数:

int DBDatabase::sqlite3_callback(void* para, int n_column, char** column_value, char** column_name)
{
    DBRecordSet* set = (DBRecordSet*)para;
    set->AddRecord();
    for(int i = 0 ; i     {
        wxString field(column_name[i], wxMBConvUTF8());
        wxString value(column_value[i], wxMBConvUTF8());
        set->AddField(field, value);
    }
    return SQLITE_OK;
}

bool DBDatabase::QueryRecordSet(const wxString& sql, DBRecordSet* set)
{
    set->Clear();
    char* errMsg = NULL;
    bool ret = (SQLITE_OK == sqlite3_exec(sqlite3DB, sql.ToUTF8(), DBDatabase::sqlite3_callback, (void*)set, &errMsg));
    if (errMsg != NULL)
    {
        if (! ret)
        {
            m_err = wxString::From8BitData(errMsg);
            m_err += wxT("\r\n");
        }
        sqlite3_free(errMsg);
    }
    return ret;
}

  评论这张
 
阅读(15)| 评论(8)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017