C/C++操作SQLite

最近几天在学习sqlite3,颇有点收获,下面介绍一下简单用法:
1.先下载sqlite3.h和sqlite3.c(如果不知道怎么下载的话就去www.sqlite.org)
如果要编译成lib。则需要用到sqlite3.def 文件。具体要把sqlite3.def放到我们vs安装目录的的bin目录下。利用lib.exe来生成 sqlite3.lib。命令为: LIB /DEF:sqlite3.def /machine:IX86。如果执行成功的话,在bin目录下就可以找到sqlite3.lib 和sqlite3.exp 文件。lib文件就可以用了。
我用的vs2010,所以就拿vs2010来举例吧,新建工程SqliteTest,建好后把sqlite3.h和sqlite3.c添加到工程里,然后在建立一个main.cpp来写测试代码,如图所示:
C/C++操作SQLite
2.先介绍基本函数:
1)打开数据库:
int sqlite3_open( const char *filename,     /* Database filename (UTF-8) */
                            sqlite3 **ppDb                /* OUT: SQLite db handle */ 
                          );
说明:filename是要打开或创建的数据库文件,可以以.db的结尾(如:test.db),如果没有此文件则系统会创建此文件,否则系统将打开指定的数据库;ppDb是指针的指针,指向sqlite3*的输出参数,因此打开数据库前先要定义sqlite3*数据类型。
注意:sqlite3* 数据类型在以后得操作中经常被使用到。
返回类型:当返回SQLITE_OK时代表执行成功,SQLITE_OK是sqlite预定义的一个宏,在sqlite3.h中可以找到更多的宏,如打开一个test.db的操作:
sqlite3 *db = NULL;
int result ;
result = sqlite3_open("D:\\test.db", &db );
if(result == SQLITE_OK)
{
        //执行下一步操作。。。。。。。
}

2)执行有回调函数sql语句:
int sqlite3_exec(
                 sqlite3 *db,         /* An open database */
                 const char *sql,     /* SQL to be evaluated */
                 int (*callback)(void*,int,char**,char**),  /* Callback function */
                 void *,              /* 1st argument to callback */
                 char **errmsg        /* Error msg written here */
                 );
说明:第一个参数不说了(就是sqlite3_open()的那个输出参数), 第二个参数是要执行的sql语句,以‘\0’结尾的字符窜,
第三个参数callback为回调函数,此函数的作用是当执行完sqlite3_exec()时,自动执行的,就像windows下的线程函数一样,
第四个参数为传递给callback函数的第一个参数,最后一个为输出参数,执行前需要预先设置为空,当此函数执行失败是可以查看
errmsg来查找错误原因。当执行select语句时经常用到回调函数。当不需要执行回调函数时,callback参数,和void*参数都
可以设置为空。同样当返回SQLITE_OK时代表成功。

回调函数callback:
int (*callback)(void *para, int nCols, char **ColValue, char **ColName);
说明:para参数通过传进来的参数,进行强制转换来使用,
      nCols参数为执行的结果的列数(字段数目);
      ColValue参数为每一列的值,
      ColName参数为字段名。
注意:ColValue和ColName都为一维数组,通过循环来取值(利用 ColValue[i] 或者 *(ColValue + i) 可以取得到值 )。
      并不是每次回调函数都要执行,比如select语句,只有查找到结果时才执行callback函数,查找不到结构是不会执行的


3)执行无回调函数的sql语句:
int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *sql,     /* SQL to be evaluated */
  char ***azResult,    /* Results of the query */
  int *nRow,           /* Number of result rows written here */
  int *nColumn,        /* Number of result columns written here */
  char **errMsg       /* Error msg written here */
);
说明:参数db不用说了
      参数sql也不用说
      参数azResult为结果,是输出参数。要记住它是一维数组哦,此结果中包括了表头(即列名)从0到nColumn,azResult[i]为列名,此后全为
列的值,看下图可以说明问题(此图是粘贴的,将就看吧,可以说明问题的):

C/C++操作SQLite
        参数nRow为结果的行数(即多少条记录),为输出参数
        参数nColumn为结果的列数(字段数),为输出参数
        参数errMsg是错误信息,前面有介绍,不多说,为输出参数

 

 执行完以后别忘了执行释放资源函数:void sqlite3_free_table(char **result);

4)最后关闭数据库:
  void sqlite_close(sqlite *db);
说明:操作完数据库后别忘了关闭数据库;

下面来粘贴代码部分:
#include"sqlite3.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int MyCallback(void *para, int nColumn, char ** colValue, char ** colName);//回调函数

void main(int argc, char *argv[])
{
	sqlite3* db = NULL;
	int result = sqlite3_open("D:\\test.db", &db);

	if(result != SQLITE_OK)
	{
		printf("open database text.db failed \n");
		return;
	}
	else
	{
		printf("open database text.db success \n");
	}
	////////开始执行sqlite
	const char *sql = "create table Student(t_id integer primary key autoincrement, t_name varchar(15), t_age integer)";
	char *errMsg = NULL;
	result = sqlite3_exec(db,
		              sql,
			      NULL,
			      NULL,
			      &errMsg);
	if(result != SQLITE_OK)
	{
		printf("create table Student failed\n");
		printf("error conde %d \t error message:%s", result, errMsg);
	}
	//插入数据
	errMsg = NULL;
	sql = "insert into Student(t_name, t_age) values ('dwb', 23)";
	result = sqlite3_exec(db,
		              sq,
                              NULL,
                              NULL,
			      &errMsg);
	printf("insert message1:%s \n", errMsg);

	errMsg = NULL;
	sql = "insert into Student(t_name, t_age) values ('dhx', 25)";
	result = sqlite3_exec(db,
		              sql,
			      NULL,
			      NULL,
			      &errMsg);
	printf("insert message2:%s \n", errMsg);

	errMsg = NULL;
	sql = "insert into Student(t_name, t_age) values ('dwz', 21)";
	result = sqlite3_exec(db,
		              sql,
			      NULL,
			      NULL,
			      &errMsg);
	printf("insert message3:%s \n", errMsg);

	////////////////////////////////////////////////////////
	errMsg = NULL;
	sql = "select * from Student;";
	result = sqlite3_exec(db, sql, MyCallback, NULL, &errMsg);
	printf("select message:%s \n", errMsg);

	//执行不用回调函数的sql语句,先要设置函数所需的参数
	printf("\nUSEING sqlite3_get_table()----------------------------\n");
	sql = "select * from Student;";

	int nCols;
	int nRows;
	char **azResult;
	errMsg = NULL;
	int index = 0;

	result = sqlite3_get_table(db,sql, &azResult, &nRows, &nCols, &errMsg);
	printf("result = %d \t errMsg = %s \n", result, errMsg);
	printf("rows:%d \t cols: %d \n", nRows, nCols);
	index = nCols;

	printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
	for(int i = 0; i < nRows; i ++)
	{
		for(int j = 0; j < nCols; j ++)
		{
			printf("%s::%s", azResult[j], azResult[index]);
			index ++;
			printf("\n");
		}		
	}
	printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

	sqlite3_free_table(azResult);
	sqlite3_close(db);
}

int MyCallback(void *para, int nColumn, char ** colValue, char ** colName)
{
	printf("----------------------------------------------------\n");
	printf("包含的列数:%d\n", nColumn);
	for(int i = 0;i < nColumn; i ++)
	{
	      printf("%s :%s\n", *(colName + i), colValue[i]);//指针和数组的两种写法
	}
	printf("----------------------------------------------------\n");
	return 0;
}
结果如下:

C/C++操作SQLite
学会这些后基本可以使用sqlite了,当然这些只是sqlite博大精深的冰山一角,笔者还在学习中,以后会陆续更新。。。

上一篇:前端工程师想要做一个Vue-ts后台管理系统,如何完成?


下一篇:迁移设备存储报的错误及解决方式