sqlite入门教程

Sqlite入门教程  

2011-08-29 17:43:27|  分类: 数据库|字号 订阅

一、创建并打开数据库

int sqlite3_openstring,sqlite3**

String标识你要打开的数据库文件路径(例:C://my.db),如果文件不存在,则会创建一个。

Sqlite3**为关键数据结构,数据库打开后,此变量就代表了你要操作的数据库。

返回值标识操作是否正确,例:SQLITE_OK。具体值见sqlite3.h的解释,很详细。

二、关闭数据库

如果你打开了数据库,不要忘了关闭它。

int dqlite3_closesqlite3*

 

以上两点实现过程:

//声明sqlite关键结构指针

sqlite3* db=NULL;

int resulte;

//打开数据库,传入db指针的指针,因为open函数要为db指针分配内存,还要让db指针的指针指向这片内存区域

resulte=sqlite3_open("my",&db);

if(resulte!=SQLITE_OK){}

else{}

//关闭数据库

sqlite3_close(db);

 

三、SQL语句操作

int sqlite3_exec(sqlite3*,  const char*sql,  sqlite3_callback,  void*,  char**ermsg)

参数一 关键数据结构

参数二 sql语句,以‘\0’结尾

参数三 回调,当这条语句执行后,sqlite3会去调用你提供的这个函数

参数四 void*是你提供的指针,这个参数会最终传到回调函数中去,如果你不需要传地指针给回调函数,可以填NULL

参数五 错误信息。这是指针的指针。可以直接cout<<errmsg得到错误信息。

 

在进行insertdelete等操作时,通常将cllbackvoid设置为NULL,即不需要回调。

但是做select时必须使用回调函数,从而获得查询结果。

 

四、回调函数

typedef int *sqlite3_callback)(void* int char** char**);

回调函数必须定义成上面的类型。

下面给出简单的例子:

int LoadMyInfovoid* para int n_column char** column_value char** column_name

参数一 用不着,不管

参数二 此记录有多少列

参数三 一维数组,查出的结果都在此数组中存放。

参数四 column_value对应值所在的列的列名

 

以上两点实现过程:

回调函数定义:

int LoadMyInfo(void* para,int n_column,char **column_value,char** column_name)

{

     cout<<"本条记录的列数:"<<n_column<<endl;

     for(int i=0;i<n_column;i++)

     {

         cout<<"字段名:"<<column_name[i]<<"字段值:"<<column_value[i]<<endl;

     }

     return 0;

}

Main函数中创建表和执行插入语句:

resulte=sqlite3_exec(db,"create table MyTable_1(ID integer primary key autoincrement,name nvarchar(32))",NULL,NULL,&errmsg);

if(resulte!=SQLITE_OK)

     cout<<"创建失败:"<<resulte<<"   "<<errmsg<<endl;

else

{

     resulte=sqlite3_exec(db,"insert into MyTable_1(name)values('')",NULL,NULL,&errmsg);

     if(resulte!=SQLITE_OK)

         cout<<"插入失败:"<<resulte<<"   "<<errmsg<<endl;

     resulte=sqlite3_exec(db,"insert into MyTable_1(name)values('')",NULL,NULL,&errmsg);

     if(resulte!=SQLITE_OK)

         cout<<"插入失败:"<<resulte<<"   "<<errmsg<<endl;

//查询

     //每查询到一条记录就会执行一次回调函数

     resulte=sqlite3_exec(db,"select* from MyTable_1",LoadMyInfo,NULL,&errmsg);

}

 

五、非回调函数的查询语句

int sqlite3_get_tablesqlite3*const char *sql char*** resultp int *nrow int *ncolumn char **errmsg);

参数一 关键数据结构

参数二 SQL语句

参数三 查询结果,依然是一维数组。内部布局是:第一行是字段名称,后面是紧接着的每个字段的值。

参数四 多少行

参数五 多少列

参数六 错误信息

 

dbReulte的字段值是连续的,从0nColumn-1都是字段名称,从第nColumn开始都是字段值。

还有,最后不管查询结果如何,都必须释放dbResutlte

 

sqlite3* db=NULL;

int resulte;

char* errmsg=NULL;

char** dbResulte;

 

int nRow,nColumn;

int i,j;

int index;

 

//打开数据库,传入db指针的指针,因为open函数要为db指针分配内存,还要让db指针的指针指向这片内存区域

resulte=sqlite3_open("my.db",&db);

if(resulte!=SQLITE_OK)

{

      cout<<"打开数据库失败!"<<endl;

}

else

{

      cout<<"成功创建并打开数据库!"<<endl;

      resulte=sqlite3_get_table(db,"select *from MyTable_1",&dbResulte,&nRow,&nColumn,&errmsg);

      if(resulte==SQLITE_OK)

      {

           index=nColumn;

           cout<<"记录总数:"<<nRow<<endl;

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

           {

               cout<<""<<i<<"条记录:";

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

               {

                    cout<<字段名:"<<dbResulte[j]<<字段值:"<<dbResulte[index];

                    index++;

               }

               cout<<endl;

           }

      }

}

sqlite3_free_table(dbResulte);

//关闭数据库

sqlite3_close(db);

 

 

以下重点讲: sqlite3_get_table

  1. {
  2.  sqlite3 *db;
  3.  char *errmsg=NULL;    //用来存储错误信息字符串
  4.  char ret=0;
  5.  int my_age=0;    //类型根据要提取的数据类型而定
  6.  char **dbResult; 
  7.  int nRow=0, nColumn=0;     //nRow 查找出的总行数,nColumn 存储列

  8.  ret = sqlite3_open("student.db",&db);
  9.  if(== ret)     //数据库创建未成功
  10.  {
  11.   fprintf(stderr, "Can't open this database: %s\n", sqlite3_errmsg(db));    //用sqlite3_errmsg()得到错误字符串
  12.   sqlite3_close(db);
  13.   return -1;
  14.  }

  15.  ret=sqlite3_get_table(db, "select * from age;", &dbResult, &nRow, &nColumn, &errmsg);

  16.  if(NULL!=errmsg)
  17.  {
  18.   sqlite3_free_table(dbResult);
  19.   errmsg=NULL;
  20.   return -1
  21.  }

  22.  my_age = atoi(dbResult[nColumn]);
  23.  sqlite3_free_table(dbResult);
  24.  return 0;
  25. }

sqlite3 *db创建数据库类型的指针,通过sqlite3_open()函数使db指针指向该数据库。

注意:

1、 char **dbResult; 字符型的二重指针,将数据库里sqlite3_get_table()出来的数据以字符的方式给dbResult。

2、select * from age;查询student数据库里的age表全部内容。

3、my_age = atoi(dbResult[nColumn]);将查询出来给dbResult的数据(字符)通过aoti()转换成整型交给变量my_age供程序中直接应用。

重点:(假设age表里有n个字段)

1、通过select * from age;给dbResult的字符前n个(0,n)为字段名称(只有计算机认识),dbResult[n]以后分别代表字段的值(包括dbResult[n])。如图

           *      *      *      * .........*  (dbResult[0]~[n-1]分别代表字段名)

  dbResult[n]   [n+1]  [n+2]  [n+3].....[n+n-1] (dbResult[n]~[n+n-1]分别代表第一条记录的值)

  dbResult[2n]  [2n+1] [2n+2] [2n+3]....[2n+n-1](dbResult[2n]~[2n+n-1]分别代表第二条记录的值)

  dbResult[3n]  [3n+1] [3n+2] 32n+3]....[3n+n-1](dbResult[3n]~[3n+n-1]分别代表第三条记录的值)

注:sqlite3_get_table()之后便将以上的n(字段数:简称列)给了nColumn这个变量,可直接应用。nRow变量代表共有多少条记录,可直接应用。

2、通过select * from age where id=0;如果查到0条记录的话nRow等于0,查到1条记录的话nRow等于1,假设查到1条数据,举例:

           *      *      *      * .........*  (dbResult[0]~[n-1]分别代表字段名)

  dbResult[n]   [n+1]  [n+2]  [n+3].....[n+n-1] (dbResult[n]~[n+n-1]分别代表第一条记录的值)

注:此时dbResult[]只有0~2n-1共2n个字符,此时如果对dbResult[2n]引用的话就会出错。查询两条语句的话以此类推。

           *      *      *      * .........*  (dbResult[0]~[n-1]分别代表字段名)

  dbResult[n]   [n+1]  [n+2]  [n+3].....[n+n-1] (dbResult[n]~[n+n-1]分别代表第一条记录的值)

  dbResult[2n]  [2n+1] [2n+2] [2n+3]....[2n+n-1](dbResult[2n]~[2n+n-1]分别代表第二条记录的值)

注:此时dbResult[]只有0~3n-1可引用。

http://blog.chinaunix.net/uid-26520343-id-3064257.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值