编译加上连接库 -lsqlite3
<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>
#define DB_NAME "zb.db"
#define TRUE 1
#define FALSE 0
sqlite3 *pdb = NULL;
char *Errmsg = NULL;
//创建数据库 zb.db
int open_db()
{
int rc;
rc = sqlite3_open(DB_NAME , &pdb);
if( rc != SQLITE_OK)
{
printf("can't open database:%s\n",sqlite3_errmsg(pdb));
sqlite3_close(pdb) ;
exit(1);
}
return 0;
}
//创建表 student
int creat_table()
{
int rc;
char *strsql = "create table if not exists student(id integer primary key, name text, age integer);";
//if not exists如果表student不存在则创建它,当我们第二次运行时执行这个语句(如果表存在,不再创建表)。
rc = sqlite3_exec(pdb , strsql , 0 , 0 ,&Errmsg);
if(rc != 0)
{
fprintf(stderr , "can't open database: %s\n",sqlite3_errmsg(pdb));
sqlite3_close(pdb);
exit(1);
}
return 0;
}
/*数据插入*/
int insert_data()
{
int flag = TRUE;
char buff[1024];
char *strsql;
int rc = 0 ;
char temp[3][20];
strsql = buff;
if(open_db != 0)//创建数据库 创建表
{
open_db();
}//open_db();
creat_table();
strcpy(strsql, "insert into student");
strcat(strsql , " values(? , ? , ?);");
sqlite3_stmt *stmt = NULL;
rc = sqlite3_prepare_v2(pdb , strsql , strlen(strsql) , &stmt , NULL);
if(rc != SQLITE_OK)
{
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(pdb);
return -1;
}
while(flag)
{
memset(temp,0,sizeof(temp));
printf("学号:");
scanf("%s", temp[0]);
printf("姓名:");
scanf("%s", temp[1]);
printf("年龄:");
scanf("%s", temp[2]);
sqlite3_bind_text( stmt , 1 , temp[0] , strlen(temp[0]), NULL);
sqlite3_bind_text( stmt , 2 , temp[1] , strlen(temp[1]), NULL);
sqlite3_bind_text( stmt , 3 , temp[2] , strlen(temp[2]), NULL);
/*
在SQL声明准备好之后(其中绑定的步骤是可选的), 需要调用以下的方法来执行:
int sqlite3_step(sqlite3_stmt*);
如果SQL返回了一个单行结果集,sqlite3_step() 函数将返回 SQLITE_ROW , 如果
SQL语句执行成功或者正常将返回SQLITE_DONE , 否则将返回错误代码. 如果不能
打开数据库文件则会返回 SQLITE_BUSY . 如果函数的返回值是 SQLITE_ROW.
*/
if(sqlite3_step(stmt) != SQLITE_DONE)
{
sqlite3_finalize(stmt);
sqlite3_close(pdb);
printf(" faile \n" );
return 0;
}
sqlite3_reset(stmt);
printf("Do you want to do insert ?(0 break, 1 insert):\n");
scanf("%d", &flag);
}
sqlite3_finalize(stmt);
printf("insert success!\n");
sqlite3_close(pdb);
return 0;
}
/*数据的查询*/
int search_data()
{
int rc;
if(open_db != 0)
{
open_db();
}
char *strsql = "select * from student" ;
sqlite3_stmt *stmt = NULL;
rc = sqlite3_prepare_v2(pdb , strsql , strlen(strsql) , &stmt , NULL);
if(rc != SQLITE_OK)
{
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(pdb);
return -1;
}
/*
sqlite3_column_count()函数返回结果集中包含的列数.
sqlite3_column_count() 可以在执行了 sqlite3_prepare()之后的任何时刻调用.
sqlite3_data_count()除了必需要在sqlite3_step()之后调用之外,其他跟
sqlite3_column_count() 大同小异. 如果调用sqlite3_step() 返回值是
SQLITE_DONE 或者一个错误代码, 则此时调用sqlite3_data_count() 将返回 0 ,
然而 sqlite3_column_count() 仍然会返回结果集中包含的列数.
sqlite3_column_type()函数返回第N列的值的数据类型. 具体的返回值如下:
#define SQLITE_INTEGER 1
#define SQLITE_FLOAT 2
#define SQLITE_TEXT 3
#define SQLITE_BLOB 4
#define SQLITE_NULL 5
sqlite3_setp()
用于执行有前面sqlite3_prepare创建的准备语句。这个语句,执行到结果的第一行可用的位置。
继续前进(执行)到结果的第二行的话,只需再次调用sqlite3_setp()。继续调用sqlite3_setp()
直到这个语句完成。
不返回结果的语句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只执行一次就返回。
*/
int nColumn = sqlite3_column_count(stmt); //ncolumn 表的列数
int vtype , i;
do{
rc = sqlite3_step(stmt);
if(rc == SQLITE_ROW)
{
for(i = 0 ; i < nColumn ; i++ ) //打印一行的信息
{
vtype = sqlite3_column_type(stmt , i); //sqlite3_column_type()函数返回第列的值的数据类型
if(vtype == SQLITE_INTEGER)
{
printf("%s:%d\n" , sqlite3_column_name(stmt , i) , sqlite3_column_int(stmt , i));
}
else if(vtype == SQLITE_TEXT)
{
printf("%s:%s\n" , sqlite3_column_name(stmt , i) , sqlite3_column_text(stmt , i));
}
else if(vtype == SQLITE_NULL)
{
printf("no values\n");
}
}
printf("---------------\n");
}else if(rc == SQLITE_DONE)
{
//printf("Select finish\n");
printf("查看成功\n");
break;
}else
{
printf("Select faile\n");
sqlite3_finalize(stmt);
break;
}
}while(1);
sqlite3_finalize(stmt);
sqlite3_close(pdb);
return 0;
}
int main(int argc , char **argv)
{
int n;
printf("1.添加 2.修改 3.删除 4.查看\n");
printf("choose[1 - 4]:");
scanf("%d" , &n);
getchar();
switch(n)
{
case 1:
insert_data();
// printf("添加成功\n");
break;
case 2:
printf("修改成功\n");
break;
case 3:
printf("删除成功\n");
break;
case 4:
search_data();
break;
default :
printf("error\n");
}
return 0;
}
</span>