一、创建并打开数据库
int sqlite3_open(string,sqlite3**)
String标识你要打开的数据库文件路径(例:C://my.db),如果文件不存在,则会创建一个。
Sqlite3**为关键数据结构,数据库打开后,此变量就代表了你要操作的数据库。
返回值标识操作是否正确,例:SQLITE_OK。具体值见sqlite3.h的解释,很详细。
二、关闭数据库
如果你打开了数据库,不要忘了关闭它。
int dqlite3_close(sqlite3*)
以上两点实现过程:
//声明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得到错误信息。
在进行insert和delete等操作时,通常将cllback和void设置为NULL,即不需要回调。
但是做select时必须使用回调函数,从而获得查询结果。
四、回调函数
typedef int (*sqlite3_callback)(void*, int, char**, char**);
回调函数必须定义成上面的类型。
下面给出简单的例子:
int LoadMyInfo(void* 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_table(sqlite3*,const char *sql, char*** resultp, int *nrow, int *ncolumn, char **errmsg);
参数一 关键数据结构
参数二 SQL语句
参数三 查询结果,依然是一维数组。内部布局是:第一行是字段名称,后面是紧接着的每个字段的值。
参数四 多少行
参数五 多少列
参数六 错误信息
dbReulte的字段值是连续的,从0到nColumn-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
- {
- sqlite3 *db;
- char *errmsg=NULL; //用来存储错误信息字符串
- char ret=0;
- int my_age=0; //类型根据要提取的数据类型而定
- char **dbResult;
- int nRow=0, nColumn=0; //nRow 查找出的总行数,nColumn 存储列
-
- ret = sqlite3_open("student.db",&db);
- if(1 == ret) //数据库创建未成功
- {
- fprintf(stderr, "Can't open this database: %s\n", sqlite3_errmsg(db)); //用sqlite3_errmsg()得到错误字符串
- sqlite3_close(db);
- return -1;
- }
-
- ret=sqlite3_get_table(db, "select * from age;", &dbResult, &nRow, &nColumn, &errmsg);
-
- if(NULL!=errmsg)
- {
- sqlite3_free_table(dbResult);
- errmsg=NULL;
- return -1
- }
-
- my_age = atoi(dbResult[nColumn]);
- sqlite3_free_table(dbResult);
- return 0;
- }
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可引用。