#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
int create_table(sqlite3 * pdb)
{
char * errmsg = NULL;
char * sql;//存储命令
int ret;
sql = "create table if not exists mytable (id integer primary key,name text);";
//给创建表的命令赋值(id,name),表如果不存在就创建
ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg);
if(SQLITE_OK != ret)
{
printf("create table failed! %s\n",errmsg);
return -1;
}
else
{
return SQLITE_OK;
}
}
void insert_record(sqlite3 * pdb)
{
char * errmsg = NULL;
char sql[100];//
int ret;
int id;
char name[30];
printf("please input id and name:\n");
scanf("%d%s",&id,name);
//sq1 = "insert into mytable (id,name) value (1,'chen');";
sprintf(sql,"insert into mytable(id,name) values (%d,'%s');",id,name);
//插入
ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg);
if(SQLITE_OK != ret)
{
printf("insert error 1! %s\n",errmsg);
exit(-1);
}
#if 0
sql = "insert into mytable values (NULL,'zhang');";
ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg);
if(SQLITE_OK != ret)
{
printf("insert error 2! %s\n",errmsg);
exit(-1);
}
sql = "insert into mytable values (NULL,'liang');";
ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg);
if(SQLITE_OK != ret)
{
printf("insert error 3! %s\n",errmsg);
exit(-1);
}
#endif
}
int displaycb(void * para,int n_col, char ** val_col,char ** name_col)
{
//查询结果里有几列,每一列的值,
int i;
int * flag = NULL;
flag = (int *)para;
if(0 == *flag )
{
printf("total column is %d\n",n_col);
//查询结果有几列
for( i = 0; i < n_col; i++)//几列
{
printf("%10s",name_col[i]);//每一列的名字
//字符型的指针数组,每个元素是字符型指针,就是字符串
}
printf("\n");
*flag = 1;
}
for(i = 0;i < n_col;i++)//显示每一列的值
{
printf("%10s",val_col[i]);
}
printf("\n");
return 0;
}
void inquire_usecb(sqlite3 * pdb)
{
char * errmsg = NULL;
char * sql;
int ret;
int flag = 0;
sql = "select * from mytable;";
//查询
ret = sqlite3_exec(pdb,sql,displaycb,(void *)&flag,&errmsg);
//
if(SQLITE_OK != ret)
{
printf("select error! %s\n",errmsg);
}
}
void inquire_nocb(sqlite3 * pdb)
{
char *sql = NULL;
char ** azresult = NULL;//二级指针是一个指向指针数组的指针,指向空
//一维数组的起始地址,指向一维数组的指针,它是指向指针数组的
char * errmsg = NULL;
int n_row,n_col;
int ret,i;
sql = "select * from mytable;";
ret = sqlite3_get_table(pdb,sql,&azresult,&n_row,&n_col,&errmsg);
if(SQLITE_OK != ret)
{
printf("get tabble error! %s\n",errmsg);
exit(-1);
}
printf("n_row = %d n_col = %d\n",n_row,n_col);
printf("the result of inquire is:\n");
for(i = 0; i < (n_row + 1) * n_col ;i++)
{
printf("%10s",azresult[i]);
if((i + 1) % n_col == 0)
{
printf("\n");
}
}
sqlite3_free_table(azresult);
//把所有的查询结果都处理完以后,要free,把数组free掉
//前面为什么不用free
}
int main()
{
sqlite3 * pdb = NULL;
int ret;
ret = sqlite3_open("mydatabase.db",&pdb);
//数据库的名字,二级指针,指向数据库的指针
if(SQLITE_OK == ret)//数据库创建成功
{
printf("you have opened a sqlite3 database successfull!\n");
}//提示信息
else
{
printf("can't open database! %s\n",sqlite3_errmsg(pdb));
sqlite3_close(pdb);
exit(EXIT_FAILURE);
}
if(SQLITE_OK != create_table(pdb))//创建表
{
sqlite3_close(pdb);
return 0;
}
insert_record(pdb);
// inquire_usecb(pdb);
inquire_nocb(pdb);
sqlite3_close(pdb);
return 0;
}
终端:
judy@judy-virtual-machine:~/桌面/ft$ gcc sjk1.c -osjk1 -lsqlite3
judy@judy-virtual-machine:~/桌面/ft$ ./sjk1
you have opened a sqlite3 database successfull!
please input id and name:
2 xu
n_row = 2 n_col = 2
the result of inquire is:
id name
1 zhang
2 xu