在c++中使用sqlite3

一、基础知识介绍

1.sqlite数据类型

NULL 空
INTEGER 整型
REAL 浮点型
TEXT 文本
BLOB 二进制对象 图片音频 视频

2.数据库增删改查语句

INSERT INTO TestTable(value1,value2) VALUES(?,?)
DELETE from TestTable where key = 2
UPDATE TestTable set value = 25000.00 where key=1;
SELECT * from TestTable

二、sqlite3函数介绍

1.打开数据库文件 如果不存在就创建

sqlite3_open()
sqlite3_open_v2()

sqlite3* db = NULL;
const char* path="  .../test.db"   //必须是c语言字符串
							//路径        数据库连接对象
if (sqlite3_open(path, &db) == SQLITE_OK)
{
	
}

sqlite3_open_v2 还可以在打开时设置一些参数:
SQLITE_OPEN_NOMUTEX: 设置数据库连接运行在多线程模式(没有指定单线程模式的情况下)
SQLITE_OPEN_FULLMUTEX:设置数据库连接运行在串行模式。
SQLITE_OPEN_SHAREDCACHE:设置运行在共享缓存模式。
SQLITE_OPEN_PRIVATECACHE:设置运行在非共享缓存模式。
SQLITE_OPEN_READWRITE:指定数据库连接可以读写。
SQLITE_OPEN_CREATE:如果数据库不存在,则创建。

2.关闭数据库文件

sqlite3_close(sqlite3* db);

if(db)
{
	sqlite3_close(db);
	db=nullptr;
}
3.解析和编译sql语句

解析并编译sql语句,将编译好的sql语句 存储到一个sqlite3_stmt的结构中

int sqlite3_prepare_v2(
  sqlite3 *db,              		数据库连接对象
  const char *zSql,         		使用UTF-8编码的Sql语句
  int nBytes,               		表示Sql语句的长度,如果为-1则全部读取zSql
  sqlite3_stmt **ppStmt,    	    OUT: 指向编译后的数据结构
  const char **pzTail      			OUT: 如果zSql没有读取完,剩下的会被指向pzTail,pzTail一般传入NULL
)
const char *sqlCode = "....";
sqlite3_stmt *stmt = NULL;
if (sqlite3_prepare_v2(db, sqlCode, -1, &stmt, NULL) == SQLITE_OK) {
    //todo
}

4.绑定参数

sql语句中的参数可以用"?“代替 ,使用sqlite3_bind_XXX() 将参数绑定到”?"的位置

参数1:sqlite3_stmt类型 Sql语句编译后的数据结构
参数2:int类型 表示需要代替的第几个问号
参数3:代替问号的值
参数4:有些接口没有,有的有,这里指绑定字节的长度,填-1就是全部读取
参数5:传入SQLITE_TRANSIENT或SQLITE_STATIC

SQLITE_TRANSIENT 指SQLite会在绑定后返回之前自己创建内存托管,一般使用这个
SQLITE_STATIC 指SQLite假定该信息位于静态非托管空间中,不需要释放,

const char *sql_select = "UPDATE mytable SET value= ? WHERE key =? ";
int InIntvalue = 1;

sqlite3_bind_text(stmt, 1, "aaa", -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 2, InIntvalue);

5.执行语句

sqlite3_step(sqlite3_stmt *pStmt)
返回值:SQLITE_ROW指还没执行完,SQLITE_DONE指已经执行完成

if (sqlite3_step(stmt) == SQLITE_DONE) {
    //todo
}
6.重置语句

sqlite3_reset(sqlite3_stmt *pStmt)
把sqlite3_stmt 结构重置到sqlite3_prepare_v2执行后sqlite3_step执行前的状态

7.获取结果集

sqlite3_column_XXX接口通过在sqlite3_step执行过后,从sqlite3_stmt的实例中获取查询到的结果,多用于查询
参数1:sqlite3_stmt的实例,结果集存储在内
参数2:iCol,查询结果的索引值

8.销毁语句

销毁sqlite3_prepare_XX方法创建的sqlite3_stmt实例
sqlite3_finalize(sqlite3_stmt *pStmt)

9.执行语句 合并版

sqlite3_exec语句相当于sqlite3_prepare_v2,sqlite3_step和sqlite3_finalize的封装,简便的同时对应着其效率会更低

三、示例:

1.创建数据库
sqlite3 *db = NULL;
if (sqlite3_open("test.db", &db) == SQLITE_OK) {
   const char *sql_createtable = "CREATE TABLE testTable(key INTEGER,value TEXT)";
   sqlite3_stmt *stmt = NULL;
   if (sqlite3_prepare_v2(db, sql_createtable, -1, &stmt, NULL) == SQLITE_OK) {
	   if (sqlite3_step(stmt) == SQLITE_DONE) {
		   cout<<"create table done"<<endl;
	   }
	   sqlite3_reset(stmt);
   }
   sqlite3_finalize(stmt);
}
sqlite3_close(db);
2.插入 (增 、删、改的逻辑基本相同 )
sqlite3 *db = NULL;
if (sqlite3_open("test.db", &db) == SQLITE_OK) {
   const char *sql_select = "INSERT INTO test_tbl(key,value) VALUES(?,?)";
   sqlite3_stmt *stmt = NULL;
   if (sqlite3_prepare_v2(db, sql_select, -1, &stmt, NULL) == SQLITE_OK) {
	   sqlite3_bind_text(stmt, 1, "test_key", -1, SQLITE_TRANSIENT);
	   sqlite3_bind_text(stmt, 2, "test_value", -1, SQLITE_TRANSIENT);
	   if (sqlite3_step(stmt) == SQLITE_DONE) {
		   cout<<"insert success"<<endl;
	   }
	   sqlite3_reset(stmt);
   }
   sqlite3_finalize(stmt);
}
sqlite3_close(db);

3.查询
sqlite3 *db = NULL;
if (sqlite3_open("test.db", &db) == SQLITE_OK) {
   const char *sql_select = "SELECT value FROM test_tbl WHERE key=?";
   sqlite3_stmt *stmt = NULL;
   if (sqlite3_prepare_v2(db, sql_select, -1, &stmt, NULL) == SQLITE_OK) {
	   sqlite3_bind_text(stmt, 1, "test_key", -1, SQLITE_TRANSIENT);
		while( sqlite3_step(stmt) == SQLITE_ROW )
		{
			int key=sqlite3_column_int(stmt,0);
			const unsigned char* value =sqlite3_column_text(stmt,1);
		}
	   sqlite3_reset(stmt);
   }
   sqlite3_finalize(stmt);
}
sqlite3_close(db);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值