sqlite3数据库函数

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


猜你喜欢

转载自blog.csdn.net/sinat_39061823/article/details/76796091