【数据库】SQLITE3 使用总结3

3          不使用回调查询数据库
" Z6 b. L" A' i8 M, w* d/ `- ^# T6 ?, F: H* m2 ~# ~
上面介绍的 sqlite3_exec 是使用回调来执行 select 操作。还有一个方法可以直接查询而不需要回调。但是,我个人感觉还是回调好,因为代码可以更加整齐,只不过用回调很麻烦,你得声明一个函数,如果这个函数 是类成员函数,你还不得不把它声明成 static 的(要问为什么?这又是C++基础了。C++成员函数实际上隐藏了一个参数:this,C++调用类的成员函数的时候,隐含把类指针当成函数的第一个参数 传递进去。结果,这造成跟前面说的 sqlite 回调函数的参数不相符。只有当把成员函数声明成 static 时,它才没有多余的隐含的this参数)。9 s) ~, q% O, c
& M1 O7 u5 V8 E1 e- q
虽然回调显得代码整齐,但有时候你还是想要非回调的 select 查询。这可以通过 sqlite3_get_table 函数做到。
复制内容到剪贴板
代码:
int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );
第1个参数不再多说,看前面的例子。   ?. x& [9 x, t% r5 o, J

* V* r) ?: Y6 l& r4 h第2个参数是 sql 语句,跟 sqlite3_exec 里的 sql 是一样的。是一个很普通的以\0结尾的char *字符串。) w& d% I   m$ ^0 N- S$ d
# r. z5 \# e' @/ U9 I
第3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值。下面用例子来说事。8 Q6 D   A1 f1 b# u) g; z9 I
1 {2 t9 L; }+ O. D. ]6 O8 l
第4个参数是查询出多少条记录(即查出多少行)。
( t1 o% r/ R( S' H/ @4 l; n3 g; ?+ p- s; e+ Z/ `1 |
第5个参数是多少个字段(多少列)。! X3 M7 M& |$ _( M

/ o1 `% c' A! s9 b第6个参数是错误信息,跟前面一样,这里不多说了。
. `( W+ i0 l3 |/ V
! ^6 l7 {& N- A2 O* w* Q" Z   \5 G下面给个简单例子:
复制内容到剪贴板
代码:
int main( int , char ** )

{

      sqlite3 * db;

      int result;

      char * errmsg = NULL;

char **dbResult; //是 char ** 类型,两个*号

      int nRow, nColumn;

      int i , j;

      int index;



      result = sqlite3_open( “c:\\Dcg_database.db”, &db );

if( result != SQLITE_OK )

{

    //数据库打开失败

return -1;

}

//数据库操作代码

//假设前面已经创建了 MyTable_1 表

//开始查询,传入的 dbResult 已经是 char **,这里又加了一个 & 取地址符,传递进去的就成了 char ***

result = sqlite3_get_table( db, “select * from MyTable_1”, &dbResult, &nRow, &nColumn, &errmsg );

if( SQLITE_OK == result )

{

    //查询成功



index = nColumn; //前面说过 dbResult 前面第一行数据是字段名称,从 nColumn 索引开始才是真正的数据

    printf( “查到%d条记录\n”, nRow );

    for(   i = 0; i < nRow ; i++ )

    {

      printf( “第 %d 条记录\n”, i+1 );

      for( j = 0 ; j < nColumn; j++ )

      {

             printf( “字段名:%s   ß> 字段值:%s\n”,   dbResult[j], dbResult [index] );

             ++index; // dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始,后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示

      }

      printf( “-------\n” );

    }

}



//到这里,不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放

sqlite3_free_table( dbResult );



//关闭数据库

sqlite3_close( db );

return 0;

}
到这个例子为止,sqlite3 的常用用法都介绍完了。
/ I9 j" l; m; |8 m, D/ U5 x/ Z7 b/ S6 r8 K
用以上的方法,再配上 sql 语句,完全可以应付绝大多数数据库需求。0 f" l- j- G   z$ e
( x+ I. ^0 S! V9 d; V' R' S! {
但有一种情况,用上面方法是无法实现的:需要insert、select 二进制。当需要处理二进制数据时,上面的方法就没办法做到。下面这一节说明如何插入二进制数据
posted @ 2009-05-16 11:33  jcss  阅读(527)  评论(0编辑  收藏  举报