数据库操作的基本步骤:
0.连接数据库
1.打开数据库
2.操作数据库
3.关闭数据库
sqlite3的基本元素:
两个对象与八个方法
一.封装系列
1.建立连接、打开数据库
int sqlite3_open(
const char *filename, /* 字符串形式的数据库名(UTF-8),存在则打开,不存在则创建 */
sqlite3 **ppDb /* 输出:连接对象 */
);
返回值:成功返回SQLITE_OK
其它值表示失败
//获取错误信息
const char *sqlite3_errmsg(sqlite3*);
2.操纵数据库
int sqlite3_exec(
sqlite3*, /* 代表打开的数据库 */
const char *sql, /* 字符串形式的SQL语句 */
int (*callback)(void*,int,char**,char**), /* 回调函数 */
void *, /* 回调函数的第一个参数 */
char **errmsg /* 错误信息写在此处 */
);
注:
如果要执行的SQL语句没有结果集返回(create,insert,update,delete等),那么就不需要写回调函数
如果要执行的SQL语句有结果集返回(select),那就必须写一个回调函数去获取返回的结果集
回调函数:
int callback(
void*
arg,
//exec的第四个参数
int
columnCount,
//列的数目
char**
columnValues,
//列值数组
char**
columnNames
//列名数组
)
只要查询到一条记录,该回调函数就调用一次
返回值必须是正常返回,即return 0;
3.关闭数据库
int sqlite3_close(sqlite3*)
gcc 01sqlite3_exec.c -I/home/csgec/build/sqlite3-pc/include/
-L/home/csgec/build/sqlite3-pc/lib
-lsqlite3
---------------------------------------------------
---------------------------------------------------
----------------------------
练习:使用sqlite3函数
#include<stdio.h> #include<sqlite3.h> /// /home/csgec/build/sqlite3-pc/include int main() { //1建立连接,打开数据库 sqlite3 *db; int res = sqlite3_open("/home/csgec/test.db",&db); if(res != SQLITE_OK) { fprintf(stderr,"open db err:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); return 1; } printf("open or creat db ok!\n"); //2.操纵数据库 char *errmsg; char *createSql = "create table if not exists tb_stu(id integer primary key ,name text not null,age integer);"; res = sqlite3_exec(db,createSql,NULL,NULL,&errmsg); if(res != SQLITE_OK) { fprintf(stderr,"exec error:%s\n",errmsg); sqlite3_close(db); return 1; } printf("exec ok!\n"); int id; char name[20]; int age; scanf("%d%s%d",&id,name,&age); char insertSql[1024]; sprintf(insertSql,"insert into tb_stu values(%d,'%s',%d);",id,name,age); printf("insertSql = %s\n",insertSql); res = sqlite3_exec(db,insertSql,NULL,NULL,&errmsg); if(res != SQLITE_OK) { fprintf(stderr,"insert error:%s\n",errmsg); sqlite3_free(errmsg); sqlite3_close(db); return 1; } //3.关闭数据库 sqlite3_close(db); return 0; }
---------------------------------------------------
---------------------------------------------------
----------------------------
练习:回调函数的使用
#include<stdio.h> #include<sqlite3.h> // -I /home.... int callback(void *arg,int count,char **names,char **values); int main() { sqlite3*db; int res = sqlite3_open("/home/csgec/test.db",&db); if(res != SQLITE_OK) { fprintf(stderr,"open db err: %s \n",sqlite3_errmsg(db)); sqlite3_close(db); return -1; } char *selectSql = "select id,name,age from tb_stu;"; char *errmsg; res = sqlite3_exec(db,selectSql,callback,NULL,&errmsg); if(res != SQLITE_OK) { fprintf(stderr,"exec err: %s \n",errmsg); sqlite3_free(errmsg); sqlite3_close(db); return -1; } sqlite3_close(db); return 0; } int callback(void *arg,int count,char **values,char **names) { printf("count = %d\n",count); int i; for(i = 0; i < count; i++) { printf("%s\t",names[i]); } printf("\n"); for(i = 0; i < count; ++i) { printf("%s\t",values[i]); } printf("\n"); return 0; }
---------------------------------------------------
---------------------------------------------------
----------------------------
二.详细系列
1.建立连接、打开数据库
int sqlite3_open(
const char *filename, /* 字符串形式的数据库名(UTF-8),存在则打开,不存在则创建 */
sqlite3 **ppDb /* 输出:连接对象 */
);
返回值:成功返回SQLITE_OK
其它值表示失败
//获取错误信息
const char *sqlite3_errmsg(sqlite3*);
2.准备/编译SQL语句
int sqlite3_prepare_v2(
sqlite3 *db, /* 打开的数据库 */
const char *zSql, /* 原始的字符串形式的SQL语句*/
int nByte, /* 字符串形式的SQL语句的长度,单位是字节 */
sqlite3_stmt **ppStmt, /* 输出:字节码形式的SQL语句对象 */
const char **pzTail /* 输出: 指向字符串SQL语句中未使用的部分,一般给NULL */
);
返回值:成功返回SQLITE_OK
其它值表示失败
3.执行语句对象
int sqlite3_step(sqlite3_stmt*);
参数:字节码形式的SQL语句对象
返回值:如果你的SQL语句没有返回结果集,成功返回SQLITE_DONE
如果你的SQL语句有返回结果集,成功返回SQLITE_ROW
其它值表示失败
4.销毁语句对象
int sqlite3_finalize(sqlite3_stmt *pStmt);
参数:字节码形式的SQL语句对象
返回值:成功返回SQLITE_OK
其它值表示失败
5.关闭数据库
int sqlite3_close(sqlite3*)
编译.c文件,需要连接数据库(sqlite3数据库的下载与安装请见另一篇文章sqlite3数据库ubuntu移植&arm开发板移植)
gcc 01sqlite3_exec.c -I/home/csgec/build/sqlite3-pc/include/
-L/home/csgec/build/sqlite3-pc/lib
-lsqlite3
----------------------------
----------------------------
----------------------------
----------------------------
绑定值:
int sqlite3_bind_blob
(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_double
(sqlite3_stmt*, int, double);
int sqlite3_bind_int
(sqlite3_stmt*, int, int);
int sqlite3_bind_null
(sqlite3_stmt*, int);
int sqlite3_bind_text
(sqlite3_stmt*, int,const char*,int,void(*)(void*));
第一个参数:语句对象
第二个参数:索引位置,即要把值绑定到哪个位置,下标从1开始计
第三个参数:要绑定的值
第四个参数:要绑定的值的长度
第五个参数:函数指针,清理函数,一般给NULL
返回值:成功返回SQLITE_OK
其它表示失败
重置语句对象:
sqlite3_reset(sqlite3_stmt*)
----------------------------
----------------------------
----------------------------
----------------------------
练习:绑定值函数的使用
#include<stdio.h> #include<sqlite3.h> /// /home/csgec/build/sqlite3-pc/include #include<string.h> int main() { //1建立连接,打开数据库 sqlite3 *db; int res = sqlite3_open("/home/csgec/test.db",&db); if(res != SQLITE_OK) { fprintf(stderr,"open db err:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); return 1; } printf("open or creat db ok!\n"); //2.操纵数据库 int id; char name[20]; int age; char *insertSql = "insert into tb_stu values(?,?,?);"; sqlite3_stmt *stmt; res = sqlite3_prepare_v2(db,insertSql,strlen(insertSql),&stmt,NULL); if(res != SQLITE_OK) { fprintf(stderr,"prepare error:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); return -1; } printf("prepare ok!\n"); while(1) { scanf("%d%s%d",&id,name,&age); sqlite3_bind_int(stmt,1,id); sqlite3_bind_text(stmt,2,name,strlen(name),NULL); sqlite3_bind_int(stmt,3,age); //3.执行 res = sqlite3_step(stmt); printf("step res = %d\n",res); if(res != SQLITE_DONE) { fprintf(stderr,"step error:%s\n",sqlite3_errmsg(db)); } sqlite3_reset(stmt); } //4.销毁 sqlite3_finalize(stmt); //5.关闭数据库 sqlite3_close(db); return 0; }
----------------------------
----------------------------
----------------------------
----------------------------
获取列值:
const void *sqlite3_column_blob
(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes
(sqlite3_stmt*, int iCol);
double sqlite3_column_double
(sqlite3_stmt*, int iCol);
int sqlite3_column_int
(sqlite3_stmt*, int iCol);
const unsigned
char *sqlite3_column_text
(sqlite3_stmt*, int iCol);
第一个参数:语句对象
第二个参数:下标位置,返回的一条记录的某列的下标,从0开始计
sqlite3_column_count
sqlite3_column_type
sqlite3_column_name
----------------------------
----------------------------
----------------------------
----------------------------
练习:获取列值函数的使用
#include<stdio.h> #include<sqlite3.h> /// /home/csgec/build/sqlite3-pc/include #include<string.h> int main() { //1建立连接,打开数据库 sqlite3 *db; int res = sqlite3_open("/home/csgec/test.db",&db); if(res != SQLITE_OK) { fprintf(stderr,"open db err:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); return 1; } printf("open or creat db ok!\n"); //2.操纵数据库 char *selectSql = "select id,name,age from tb_stu;"; sqlite3_stmt *stmt; res = sqlite3_prepare_v2(db,selectSql,-1,&stmt,NULL); if(res != SQLITE_OK) { fprintf(stderr,"prepare err:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); return 1; } res = sqlite3_step(stmt); while(res == SQLITE_ROW) { int id = sqlite3_column_int(stmt,0); const char*name = sqlite3_column_text(stmt,1); int age = sqlite3_column_int(stmt,2); printf("%d\t%s\t%d\n",id,name,age); res = sqlite3_step(stmt); } //4.销毁 sqlite3_finalize(stmt); //5.关闭数据库 sqlite3_close(db); return 0; }