加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

sqlite入门教程

发布时间:2020-12-12 20:10:05 所属栏目:百科 来源:网络整理
导读:Sqlite入门教程 2011-08-29 17:43:27 |分类: 数据库 | 字号 订阅 一、创建并打开数据库 int sqlite3_open ( string,sqlite3** ) String 标识你要打开的数据库文件路径(例: C://my.db ),如果文件不存在,则会创建一个。 Sqlite3** 为关键数据结构,数

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;

intresulte;

//打开数据库,传入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语句,以‘’结尾

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

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

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

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

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

四、回调函数

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

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

下面给出简单的例子:

int LoadMyInfovoid* paraint n_columnchar** column_valuechar** column_name

参数一用不着,不管

参数二此记录有多少列

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

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

以上两点实现过程:

回调函数定义:

intLoadMyInfo(void* para,intn_column,char**column_value,char** column_name)

{

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

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

{

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

}

return0;

}

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

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

if(resulte!=SQLITE_OK)

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

else

{

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

if(resulte!=SQLITE_OK)

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

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

if(resulte!=SQLITE_OK)

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

//查询

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

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

}

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

int sqlite3_get_tablesqlite3*const char *sqlchar*** resultpint *nrowint *ncolumnchar **errmsg);

参数一关键数据结构

参数二SQL语句

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

参数四多少行

参数五多少列

参数六错误信息

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

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

sqlite3* db=NULL;

intresulte;

char* errmsg=NULL;

char** dbResulte;

intnRow,nColumn;

inti,j;

intindex;

//打开数据库,传入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(inti=0;i<nRow;i++)

{

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

for(intj=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. charret=0;
  5. intmy_age=0;//类型根据要提取的数据类型而定
  6. char**dbResult;
  7. intnRow=0,nColumn=0;//nRow 查找出的总行数,nColumn 存储列

  8. ret=sqlite3_open("student.db",&db);
  9. if(1==ret)//数据库创建未成功
  10. {
  11. fprintf(stderr,"Can't open this database: %sn",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. sqlite3_free_table(dbResult);
  18. errmsg=NULL;
  19. return-1
  20. my_age=atoi(dbResult[nColumn]);
  21. return 0;
  22. }

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读