一、sqlite使用
1、安装sqlite3数据库
sudo apt-get install sqlite3 libsqlite3-dev
//在终端输入sqlite3,开始使用数据库
2、sqlite3 常用命令:(以 ‘.’ 开头)
. help 打开帮助手册
. open < 数据库文件名> 打开数据库文件
. quit 退出数据库程序 也可以是. q
. exit 退出数据库程序
. tables 查看当前数据库文件中有哪些数据表
. schema 查看建表语句- 也就是表结构
. headers on 查询时是否显示表头信息
3、SQL语句:(SQL语句必须以 ; 结束)
3.1、 创建数据表语句
CREATE TABLE 表名( 字段1 字段1 的类型, 字段2 字段2 的类型, . . . . . , 字段n 字段n的类型) ;
字段类型:
整型 INT 或者 INTEGER
字符串 CHAR 或者 TEXT
例:
CREATE TABLE student ( id INT, name TEXT, score INTEGER) ;
3.2、主键:(不可重复)(创建时设置主键)
CREATE TABLE stu ( id INT PRIMARY KEY, name CHAR, score INT) ;
3.3、 向数据表中插入数据:插入一行
INSERT INTO student VALUES ( 1001 , "张三" , 80 ) ;
INSERT INTO student ( id, name) VALUES ( 1002 , "李四" ) ;
3.4、 修改表数据:修改行内数据
UPDATE student SET score= 60 WHERE id= 1003 ;
UPDATE student SET score= 100 , name= "zhang" WHERE id= 1001 ;
3.5、 删除表数据:删除一行
DELETE FROM student WHERE name= AAA;
DELETE FROM student WHERE name= "DDD" OR score= 100 ;
3.6、 查询表数据
SELECT * FROM student;
SELECT id, score FROM student;
SELECT score FROM student WHERE id= 1001 ;
SELECT * FROM student WHERE score= 80 ;
SELECT * FROM student WHERE name= "张三" ;
SELECT * FROM student WHERE name= "李四" AND socre= 90 ;
SELECT * FROM student WHERE score= 80 OR score= 90 ;
SELECT * FROM student ORDER BY score DESC;
3.7、 添加一列
ALTER TABLE student ADD COLUMN sex CHAR;
3.8、 删除表
DROP TABLE 表名;
4、函数
4.1、打开数据库文件 .db
int sqlite3_open ( const char * filename,
sqlite3 * * ppdb ) ;
功能:打开一个数据库文件( 存在直接打开 不存在就新建并打开)
参数:
filename 数据库名字
ppdb 操作数据库的指针,数据库句柄。
返回值:
成功 SQLITE_OK
失败 error_code
4.2、获取错误信息的函数
const char * sqlite3_errmsg ( sqlite3* db) ;
功能:获取最后一次错误信息描述
4.3、执行sql语句的函数
int sqlite3_exec ( sqlite3* db, const char * sql,
int ( * callback) ( void * , int , char * * , char * * ) ,
void * arg, char * * errmsg) ;
功能:
执行一条sql语句
参数:
db 数据库的句柄指针
sql 将要被执行sql语句
callback 回调函数, 只有在查询语句时使用 其他情况可以传NULL
arg 为callback 传参的,如果不是查询语句 也可以传NULL
errmsg 错误信息的地址
( 如果使用了这个参数,要记得使用 sqlite3_free 去释放空间)
返回值:
成功 SQLITE_OK
出错 errcode 错误码
4.4、关闭数据库的函数
int sqlite3_close ( sqlite3* db) ;
功能:关闭一个数据库
4.5、获取查询结果的函数
int sqlite3_get_table ( sqlite3 * db, const char * zSql, char * * * pazResult,
int * pnRow, int * pnColumn, char * * pzErrmsg) ;
功能:
查询数据库,它会创建一个新的内存区域来存放查询的结果信息
参数:
db 数据库操作句柄
zSql 数据库的sql语句
azResult 查询的结果
nRow 行数
nColumn 列数
errmsg 错误消息
返回值:
成功 0
出错 errcode
4.6、释放由sqlite3_get_table产生的结果集
sqlite3_free_table ( azResult) ;
二、示例:函数调用+SQL语句封装
代码:
# include <stdio.h>
# include <sqlite3.h>
# include <stdlib.h>
# define MYDB "mysqlite3.db"
int mySqliteInit ( sqlite3 * * p) ;
int insert_student ( sqlite3 * p) ;
int delete_student ( sqlite3 * p) ;
int modify_student ( sqlite3 * p) ;
int search_student ( sqlite3 * p) ;
int main ( ) {
sqlite3 * p_db = NULL ;
mySqliteInit ( & p_db) ;
int choose = 0 ;
while ( 1 ) {
printf ( "------------------------------------\n" ) ;
printf ( "|1.增加 2.删除 3.修改 4.查询 5.退出|\n" ) ;
printf ( "------------------------------------\n" ) ;
printf ( "请输入你的选择 > " ) ;
scanf ( "%d" , & choose) ;
switch ( choose) {
case 1 :
insert_student ( p_db) ;
break ;
case 2 :
delete_student ( p_db) ;
break ;
case 3 :
modify_student ( p_db) ;
break ;
case 4 :
search_student ( p_db) ;
break ;
case 5 :
printf ( "退出\n" ) ;
break ;
}
if ( choose == 5 ) {
break ;
}
}
return 0 ;
}
int mySqliteInit ( sqlite3 * * p) {
int ret = 0 ;
if ( SQLITE_OK != ( ret = sqlite3_open ( MYDB, p) ) ) {
printf ( "文件%s第%d行出错,错误码[%d], 错误信息[%s]\n" , \
__FILE__ , __LINE__ , ret, sqlite3_errmsg ( * p) ) ;
return - 1 ;
}
printf ( "打开数据库文件mysqlite3.db成功\n" ) ;
char sqlbuf[ 128 ] = "CREATE TABLE IF NOT EXISTS student(id INT PRIMARY KEY, name TEXT, score INTEGER)" ;
printf ( "执行语句:[%s]\n" , sqlbuf) ;
char * errmsg = NULL ;
if ( SQLITE_OK != ( ret = sqlite3_exec ( * p, sqlbuf, NULL , NULL , & errmsg) ) ) {
printf ( "文件%s第%d行出错,错误码[%d], 错误信息[%s]\n" , \
__FILE__ , __LINE__ , ret, errmsg) ;
return - 1 ;
}
printf ( "创建数据表成功\n\n" ) ;
sqlite3_free ( errmsg) ;
return 0 ;
}
int insert_student ( sqlite3 * p) {
int input_id = 0 ;
char input_name[ 20 ] = { 0 } ;
int input_score = 0 ;
int ret = 0 ;
printf ( "请输入要添加学生的id(INT) > " ) ;
scanf ( "%d" , & input_id) ;
printf ( "请输入要添加学生的name(CHAR) > " ) ;
scanf ( "%s" , input_name) ;
printf ( "请输入要添加学生的score(INT) > " ) ;
scanf ( "%d" , & input_score) ;
char sqlbuf[ 128 ] = { 0 } ;
sprintf ( sqlbuf, "INSERT INTO student VALUES(%d, '%s', %d)" , \
input_id, input_name, input_score) ;
printf ( "执行语句:[%s]\n" , sqlbuf) ;
if ( SQLITE_OK != ( ret = sqlite3_exec ( p, sqlbuf, NULL , NULL , NULL ) ) ) {
printf ( "文件%s第%d行出错,错误码[%d], 错误信息[%s]\n" , \
__FILE__ , __LINE__ , ret, sqlite3_errmsg ( p) ) ;
return - 1 ;
}
printf ( "添加学员信息成功\n\n" ) ;
return 0 ;
}
int delete_student ( sqlite3 * p) {
int delet_id = 0 ;
int ret = 0 ;
printf ( "请输入要删除学生的id(INT) > " ) ;
scanf ( "%d" , & delet_id) ;
char sqlbuf[ 128 ] = { 0 } ;
sprintf ( sqlbuf, "DELETE FROM student WHERE id=%d" , delet_id) ;
printf ( "执行语句:[%s]\n" , sqlbuf) ;
if ( SQLITE_OK != ( ret = sqlite3_exec ( p, sqlbuf, NULL , NULL , NULL ) ) ) {
printf ( "文件%s第%d行出错,错误码[%d], 错误信息[%s]\n" , \
__FILE__ , __LINE__ , ret, sqlite3_errmsg ( p) ) ;
return - 1 ;
}
printf ( "删除学员信息成功\n\n" ) ;
return 0 ;
}
int modify_student ( sqlite3 * p) {
int modify_id = 0 ;
char modify_name[ 20 ] = { 0 } ;
int modify_score = 0 ;
int ret = 0 ;
printf ( "请输入要修改学生的id(INT) > " ) ;
scanf ( "%d" , & modify_id) ;
printf ( "请输入要修改后学生的name(CHAR) > " ) ;
scanf ( "%s" , modify_name) ;
printf ( "请输入要修改后学生的score(INT) > " ) ;
scanf ( "%d" , & modify_score) ;
char sqlbuf[ 128 ] = { 0 } ;
sprintf ( sqlbuf, "UPDATE student SET name='%s', score=%d WHERE id=%d" , \
modify_name, modify_score, modify_id) ;
printf ( "执行语句:[%s]\n" , sqlbuf) ;
if ( SQLITE_OK != ( ret = sqlite3_exec ( p, sqlbuf, NULL , NULL , NULL ) ) ) {
printf ( "文件%s第%d行出错,错误码[%d], 错误信息[%s]\n" , \
__FILE__ , __LINE__ , ret, sqlite3_errmsg ( p) ) ;
return - 1 ;
}
printf ( "修改学员信息成功\n\n" ) ;
return 0 ;
}
int search_student ( sqlite3 * p) {
char * * result;
int nrow = 0 ;
int ncolumn = 0 ;
int ret = 0 ;
char sqlbuf[ 128 ] = { 0 } ;
sprintf ( sqlbuf, "SELECT * FROM student" ) ;
if ( SQLITE_OK != ( ret = sqlite3_get_table ( p, sqlbuf, & result, & nrow, & ncolumn, NULL ) ) ) {
printf ( "文件%s第%d行出错,错误码[%d], 错误信息[%s]\n" , \
__FILE__ , __LINE__ , ret, sqlite3_errmsg ( p) ) ;
return - 1 ;
}
int i = 0 ;
int j = 0 ;
for ( i = 0 ; i < ncolumn; i++ ) {
printf ( "%-10s " , result[ i] ) ;
}
printf ( "\n" ) ;
int index = i;
for ( i = 0 ; i < nrow; i++ ) {
for ( j = 0 ; j < ncolumn; j++ ) {
printf ( "%-10s" , result[ index++ ] ) ;
}
printf ( "\n" ) ;
}
printf ( "查询学生信息成功\n\n" ) ;
return 0 ;
}
注意事项:
注意函数调用时的参数指针的使用 查找数据库的打印 编译时注意添加链接库 (-lsqlite3)