各函数用法:
int sqlite3_open(const char *filename,sqlite3 **db);
功能:打开一个sqlite3数据库
filename: 数据库路径名
db: 指向sqlite句柄的指针
返回值:成功返回SQLITE_OK,失败返回错误码(非零值)
int sqlite3_close(sqlite3 *db)
功能:关闭sqlite数据库
返回值:成功返回SQLITE_OK,失败返回错误码(非零值)
const char *sqlite3_errmsg(sqlite3 *db)
功能:通过db句柄,得到数据库操作的错误信息
返回值:返回错误信息的首地址
sql语句实现插入、删除、更新、查询
int sqlite3_exec(
sqlite3* db,
const char sql,
int (callback)(void,int,char*,char**),
void *,
char **errmsg
);
功能:执行一条sql语句
参数:db:数据库操作句柄
sql:一条sql语句
callback:回调函数,只有sql为查询语句时,才会执行此语句
arg: 表示的是给回调函数传递参数
errmsg: 错误信息
返回值:成功SQLITE_OK
回调函数:
int (*sqlite3_callback)(void *para, int f_num, char **f_value, char ** f_name);
功能:每找到一条记录自动执行一次回调函数(查询的结果,是一个函数指针类型,传递一个函数名即可)
para:传递给回调函数的参数
f_num: 记录中包含的字段数目
f_value: 包含每个字段值的指针数组
f_name: 包含每个字段名称的指针数组
返回值:成功返回0,失败返回-1;
不使用回调的查询方法:
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg)
功能:执行sql操作
db: 数据库句柄
sql: sql语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目
ncolumn:每条记录包含的字段数目
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码
创建stu.db数据库,并实现插入、删除、查询、更新操作,代码如下:
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#define DATABASE "stu.db"
int insert(sqlite3 *db)
{
int id;
char name[20] = {};
int score;
char sql[100] = {};
char * errmsg;
printf("intput id:");
scanf("%d",&id);
getchar();
printf("input name:");
scanf("%s",name);
getchar();
printf("intput score:");
scanf("%d",&score);
getchar();
sprintf(sql,"insert into stu values(%d,'%s',%d);",id,name,score); //拼接语句
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("%s\n",errmsg);
return -1;
}
return 0;
}
int delete(sqlite3 *db)
{
int id;
char sql[100] = {};
char * errmsg;
printf("intput id:");
scanf("%d",&id);
getchar();
sprintf(sql,"delete from stu where id=%d;",id);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("%s\n",errmsg);
return -1;
}
return 0;
}
int update(sqlite3 *db)
{
int id;
char name[20] = {};
int score;
char sql[100] = {};
char * errmsg;
printf("intput update id:");
scanf("%d",&id);
getchar();
printf("intput update score:");
scanf("%d",&score);
getchar();
sprintf(sql,"update stu set score = %d where id = %d;",score,id);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("%s\n",errmsg);
return -1;
}
return 0;
}
int callback(void *para, int f_num, char **f_value, char ** f_name)
{
int i = 0;
for(i = 0; i < f_num; i++)
{
printf("%-11s",f_value[i]);
}
printf("\n");
return 0;
}
/*int search(sqlite3 *db) //采用回调方式查询
{
char sql[100] = {};
char *errmsg;
sprintf(sql,"select * from stu;");
if(sqlite3_exec(db,sql,callback,NULL,&errmsg) != SQLITE_OK)
{
printf("%s\n",errmsg);
return -1;
}
}*/
int search(sqlite3 *db) // 不采用回调查询
{
char sql[100] = {};
char *errmsg;
char ** resultp;
int nrow, ncolumn, i, j, index;
sprintf(sql,"select * from stu;");
if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg) != SQLITE_OK)
{
printf("%s\n",errmsg);
return -1;
}
for(j = 0; j < ncolumn; j++) //输出表头,若不需输出表头,可将此循环注释掉
{
printf("%-11s ",resultp[j]);
}
putchar(10);
index = ncolumn; //跨过表头,直接输出记录
for(i = 0; i < nrow; i++)
{
for(j = 0; j < ncolumn; j++)
{
printf("%-11s ",resultp[index++]);
}
putchar(10); //换行符
}
sqlite3_free_table(resultp);//get_table用完后应该释放此临时开辟的空间
return 0;
}
int main(int argc, const char **argv)
{
sqlite3 *db;
char * errmsg;
int cmd;
if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
//创建数据库表
if(sqlite3_exec(db,"create table stu(id int primary key not null, name text not null,score int not null);",NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("%s\n",errmsg);
}
printf("input cmd:");
while(1)
{
printf("\n");
printf("******************************\n");
printf("1.insert 2.delete 3.search 4.update 5.quit\n");
printf("******************************\n");
printf("\n");
scanf("%d",&cmd);
getchar();
switch(cmd)
{
case 1:
insert(db);
break;
case 2:
delete(db);
break;
case 3:
search(db);
break;
case 4:
update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
default:
printf("error command\n");
}
}
return 0;
}