数据库操作的基本步骤:
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;
}