加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite的使用

发布时间:2020-12-13 00:11:57 所属栏目:百科 来源:网络整理
导读:最近频繁使用到 SQLite ,越来越发现该数据库的好用。 SQLite 是一款 开源、轻量、本地化存储、功能强大 的数据库,由于它的这些特性,使得人们在项目中广泛应用。 首先,你可能要去www.sqlite.org去下载一份 SQLite ,可能是编好的,如果没有,你可能需要自

最近频繁使用到SQLite,越来越发现该数据库的好用。SQLite是一款开源、轻量、本地化存储、功能强大的数据库,由于它的这些特性,使得人们在项目中广泛应用。


首先,你可能要去www.sqlite.org去下载一份SQLite,可能是编好的,如果没有,你可能需要自己去编一份,过程非常简单。先来看看SQLite在工程中的使用。


它提供sqlite3.hsqlite3.libsqlite3.dll这三份必需文件,我们只需在工程中含入sqlite3.h,链入sqlite3.lib,在打包时提供sqlite3.dll副本即可,非常的简单。而它的API接口也非常清晰好用,先来个总体介绍:

sqlite3							-- 数据库连接
sqlite3_stmt					-- SQL语句

sqlite3_open					-- 打开数据库,返回SQLITE_OK表示打开成功
sqlite3_close					-- 关闭数据库
sqlite3_key						-- 为数据库设置加密Key,在sqlite3_open之后调用
sqlite3_rekey					-- 更改数据库的加密Key,如果之前数据库未加密,则进行加密;如果两个参数均为0,则进行解密
sqlite3_exec 					-- 执行一条SQL语句,成功返回SQLITE_OK
sqlite3_sleep					-- 将执行挂起一段时间
sqlite3_table_column_metadata	-- 获取表的某一列的属性(类型、列名、是否为null、是否是主键、是否是auto-increment)

sqlite3_prepare					-- 准备SQL语句
sqlite3_finalize				-- SQL语句执行完毕,进行销毁释放
sqlite3_db_handle				-- 通过sqlite3_stmt获取sqlite3指针
sqlite3_bind_int    			-- 绑定一个整数到SQL语句的某个参数
sqlite3_bind_double 			-- 绑定一个浮点数到SQL语句的某个参数
sqlite3_bind_text  				-- 绑定一个字符串到SQL语句的某个参数
sqlite3_bind_blob  				-- 绑定一个内存块到SQL语句的某个参数
sqlite3_column_int 				-- 获取查询结果,按整型值返回
sqlite3_column_text 			-- 获取查询结果,按字符串返回
sqlite3_column_bolb 			-- 获取查询结果,按缓冲返回
sqlite3_column_bytes 			-- 获取查询结果某一列值的内存字节数,可结合sqlite3_column_blob使用
sqlite3_sql 					-- 查看sqlite3_stmt进行绑定后产生的SQL语句
sqlite3_bind_parameter_count 	-- 查看sqlite3_stmt的参数个数
sqlite3_bind_parameter_name 	-- 查看sqlite3_stmt的某个参数的列名
sqlite3_bind_parameter_index 	-- 查看sqlite3_stmt的某个列名对应的参数索引
sqlite3_clear_bindings 			-- 清除所有已绑定到sqlite3_stmt上的参数
sqlite3_reset 					-- 清除已绑定到sqlite3_stmt上的参数,但不清楚通过sqlite3_bind_blob绑定的参数
sqlite3_column_count 			-- 获取查询结果的列数
sqlite3_data_count 				-- 同上
sqlite3_column_type 			-- 获取查询结果中某一列的值类型
sqlite3_column_name 			-- 获取查询结果中某一索引对应的列名
sqlite3_column_database_name 	-- 获取sqlite3_stmt执行对应的数据库名
sqlite3_column_table_name 		-- 获取sqlite3_stmt执行对应的表名
sqlite3_step 					-- 执行stmt语句,返回SQLITE_ROW表示查询到数据,返回SQLITE_DONE表示成功,其他值为失败

sqlite3_changes 				-- 获取执行SQL语句影响的行数,包括INSERT、UPDATE、DELETE,触发器产生的不计在内
sqlite3_total_changes 			-- 同上,但包含触发器产生的影响计数
sqlite3sqlite3_stmt均是结构体,我们需要用指针来操作。看起来API比较多,但只要理解了,就非常好用,这些API还有提供V2版本以及基于UTF-16的宽字符版本的,比如sqlite3_open_v2sqlite3_column_text16等等,参数基本不变。下面看一个实际示例:

#include <sqlite/sqlite3.h>
#include <iostream>
#include <string>
using namespace std;
#pragma comment(lib,"sqlite3.lib")


sqlite3* OpenDatabase(const string& strDbFile)
{
	sqlite3* pdb = 0;
	sqlite3_open(strDbFile.c_str(),&pdb);
	return pdb;
}


int main()
{
	// 打开数据库连接.
	sqlite3* pDatabase = OpenDatabase("D:mytest.db");
	if (!pDatabase)
	{
		return -1;
	}
	
	const char* const CREATE_TABLE =
		"create table t_person("
		"id integer primary key,"
		"name varchar(50) not null,"
		"age integer not null"
		")";
	
	// 创建表.
	if (SQLITE_OK != sqlite3_exec(pDatabase,CREATE_TABLE,0))
	{
		return -1;
	}
	
	string strName = "Bill Gates";
	int age = 42;
	
	// 准备 SQL 语句,参数用 ? 替代.
	const char* const INSERT_STMT =
		"insert into t_person values("
		"null,?,?"
		");";
	
	sqlite3_stmt* pstmt = 0;
	const char* pTail = 0;
	sqlite3_prepare(pDatabase,INSERT_STMT,-1,&pstmt,&pTail);
	if (!pstmt)
	{
		return -1;
	}
	
	// 绑定参数,第一个参数的索引为 1 .以此类推.
	sqlite3_bind_text(pstmt,1,strName.c_str(),SQLITE_STATIC);
	sqlite3_bind_int(pstmt,2,age);
	if (SQLITE_DONE == sqlite3_step(pstmt))
	{
		cout<<"Add Person Successful!"<<endl;
	}
	
	// 销毁释放.
	sqlite3_finalize(pstmt);
	
	const char* const QUERY_STMT =
		"select * from t_person;";
	
	sqlite3_stmt* pQueryStmt = 0;
	sqlite3_prepare(pDatabase,QUERY_STMT,&pQueryStmt,&pTail);
	if (pQueryStmt)
	{
		while (SQLITE_ROW == sqlite3_step(pQueryStmt))
		{
			// 获取数据,第 1 列从 0 开始,以此类推.
			int nPersonID = sqlite3_column_int(pQueryStmt,0);
			const unsinged char* pszPersonName = sqlite3_column_text(pQueryStmt,1);
			int nPersonAge = sqlite3_column_int(pQueryStmt,2);
			
			if (pszPersonName)
			{
				cout<<"ID:   "<<nPersonID<<"n"
				    <<"Name: "<<pszPersonName<<"n"
				    <<"Age:  "<<nPersonAge<<endl;
			}
		}
		
		sqlite3_finalize(pQueryStmt);
	}
	
	// 关闭数据库连接.
	slqite3_close(pDatabase);
	return 0;
}

看起来一副非常简单的样子,反正我是信了。SQLite 还支持事务的操作,你只需在要执行的操作前后加上事务语句即可:

sqlite3_exec("begin transaction;");

// 进行 INSERT、UPDATE、DELETE等多项操作
// ...
// ...

sqlite3_exec("commit transaction;");

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读