记录sqlite3数据库常用函数接口的使用,.数据库的操作不区分大小:
int sqlite3_open(const char*, sqlite3**); //打开一个数据库
int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。
int sqlite3_close(sqlite3*); //关闭操作完成的数据库
int sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte,sqlite3_stmt **ppStmt, const char **pzTail);//这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。这个接口需要一个数据库连接指针以及一个要准备的包含SQL语句的文本。它实际上并不执行(evaluate)这个SQL语句,它仅仅为执行准备这个sql语句
int sqlite3_step(sqlite3_stmt*); //这个语句执行到结果的第一行可用的位置。继续前进到结果的第二行的话,只需再次调用sqlite3_setp()。继续调用sqlite3_setp()知道这个语句完成,那些不返回结果的语句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只执行一次就返回
int sqlite3_column_int(sqlite3_stmt*, int iCol);//int sqlite3_column系列函数,和sqlite3_prepare_v2函数搭配使用,用来获取一行的数据,第二个参数为数据库一行中的列下标。从第一个不为NULL的开始。
四种类型:
integer(整型)、real(浮点型)、text(文本字符串)、blob(二进制数据)。
关键字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。
语法:不区分大小写,每条语句后加";"结尾。编译时没有错误但是执行没有得到正确结果,要检查语法是否正确
环境:ubuntu16.04
安装:
(1) tar -zxvf sqlite-autoconf-3070500.tar.gz
(2) cd sqlite-autoconf-3070500
(3) ./configure --prefix=/xx/xxxx(/xx/xxxx表示文件生成目录)
(4) make & make install (成功后在/xx/xxxx目录下生成(bin include lib share 4个目录))
其中bin放置可执行文件sqlite3,./sqlite3 可进入sqlite命令行界面
注意:如果执行./sqlite3没有看到版本号,执行sudo apt-get install sqlite3即可
编译:gcc sqlite3.c -o sqlite3 -lsqlite3
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
sqlite3 *db = NULL;
char *errmsg = NULL;
char **result =NULL;
int num_row = 0;
int num_column = 0;
int i = 0;
sqlite3_stmt *stmt = NULL;
//创建数据库
char * create_sqlite3(void)
{
char *errmsg = NULL;
int ret = -1;
//打开数据库
sqlite3_open("test_sql",&db);
char *sql = "CREATE TABLE IF NOT EXISTS my_sql(id integer PRIMARY KEY,my_sql_id integer,my_sql_nu integer,my_sql_ip varchar(12),my_sql_cm text);";
//可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。
sqlite3_exec(db,sql,NULL,NULL,&errmsg);
//printf("ret = %d\n",ret);
return sql;
}
//向数据库插入数据
void insert_data_2_sqlite3(void)
{
char *errmsg = NULL;
char *sql1 = "INSERT INTO 'my_sql'VALUES(NULL,12,500,192,'wanda');";
sqlite3_exec(db,sql1,NULL,NULL,&errmsg);
char *sql2 = "INSERT INTO 'my_sql'VALUES(NULL,56,501,193,'henda');";
sqlite3_exec(db,sql2,NULL,NULL,&errmsg);
char *sql3 = "INSERT INTO 'my_sql'VALUES(NULL,78,502,194,'biguiyuan');";
sqlite3_exec(db,sql3,NULL,NULL,&errmsg);
char *sql4 = "INSERT INTO 'my_sql'VALUES(NULL,10,503,195,'wanke');";
sqlite3_exec(db,sql4,NULL,NULL,&errmsg);
}
//查询所有的数据库
void query_data_sqlite3(char * sql)
{
//sql = "SELECT *FROM my_sql";
sql="select *from my_sql where my_sql_nu = 502";
//创建Table
//sqlite3_prepare()将SQL语句编译为sqlite内部一个结构体(sqlite3_stmt)
//该结构体中包含了将要执行的SQL语句的信息
//第四个参数用来指向输入参数中下一个需要编译的SQL语句存放的 SQLite statement 对象的指针
sqlite3_get_table(db,sql,&result,&num_row,&num_column,&errmsg);
printf("the query result is:\n");
printf("num_row=%d,num_column=%d\n",num_row,num_column);
for(i=0;i<(num_row+1)*num_column;i++)
{
printf("result[%d]=%s\n",i,result[i]);
}
}
//删除一行
void delete_row_sqlite3(char *sql)
{
char *errmsg = NULL;
char **result =NULL;
int num_row = 0;
int num_column = 0;
int i = 0;
sql="delete from my_sql where my_sql_nu = 501;""select *from my_sql";
sqlite3_exec(db,sql,NULL,NULL,&errmsg);
sqlite3_get_table(db,sql,&result,&num_row,&num_column,&errmsg);
printf("after delete one line:\n");
printf("num_row=%d,num_column=%d\n",num_row,num_column);
for(i=0;i<(num_row+1)*num_column;i++)
{
printf("result[%d]=%s\n",i,result[i]);
}
}
//增加一行
void add_row_sqlite3(char *sql)
{
sql = "INSERT INTO my_sql VALUES(NULL,241,400,130,'wanda');""select *from my_sql";
sqlite3_exec(db,sql,NULL,NULL,&errmsg);
sqlite3_get_table(db,sql,&result,&num_row,&num_column,&errmsg);
printf("after add one line:\n");
printf("num_row=%d,num_column=%d\n",num_row,num_column);
for(i=0;i<(num_row+1)*num_column;i++)
{
printf("result[%d]=%s\n",i,result[i]);
}
}
//修改一行的数据
void updata_sqlite3(char *sql)
{
sql = "UPDATE 'my_sql' SET my_sql_cm = 'baolishanzhuang' where my_sql_cm = 'henda'";
sqlite3_exec(db,sql,NULL,NULL,&errmsg);
sql= "select *from my_sql where my_sql_cm = 'baolishanzhuang'";
//查找,并取出修改后的数据
if(sqlite3_prepare_v2(db,sql,-1,&stmt,NULL)==SQLITE_OK)
{
while(SQLITE_ROW==sqlite3_step(stmt))
{
printf("my_sql_id=%d,my_sql_nu=%d,my_sql_ip=%d,my_sql_cm =%s\n",sqlite3_column_int(stmt, 1)\
,sqlite3_column_int(stmt, 2),sqlite3_column_int(stmt, 3),sqlite3_column_text(stmt, 4));
}
}
}
int main(void)
{
char *errmsg = NULL;
char *sql=create_sqlite3();
insert_data_2_sqlite3();
query_data_sqlite3(sql);
delete_row_sqlite3(sql);
add_row_sqlite3(sql);
updata_sqlite3(sql);
//关闭操作完的数据库
sqlite3_close(db);
return 0;
}