windows下c++使用sqlite

使用git仓库

git clone https://github.com/sqlite/sqlite sqlite/sqlite
cd sqlite\sqlite
git checkout version-3.10.0 -b version-3.10.0

构建sqlite3需要Tcl85,ActiveTcl
下载ActiveTcl 8.5,安装完之后就用MSVC进行编译,我使用的是vs2015

# cmd下的命令
cd sqlite\sqlite
cmd /k D:\VS2015\VC\vcvarsall.bat :: 启用MSVC的编译环境
mkdir bld
cd bld
nmake /f ..\Makefile.msc ^  :: '^' 是换行继续输入的意思, '::' 是行注释
TOP=..\ ^ :: TOP This is the directory that contains this "Makefile.msc".
TCLLIBDIR=D:\Tcl\lib ^
TCLINCDIR=D:\Tcl\include ^
LIBTCLPATH=D:\Tcl\bin 
:: sqlite3.10.0 默认是线程安全的,如果不要,
:: 在Makefile.msc中找到-DSQLITE_THREADSAFE=1
:: 改为-DSQLITE_THREADSAFE=0

现在可以在bld目录下找到
sqlite3.h
sqlite3.c
sqlite3.lib
sqlite3.dll
sqlite3.def

  • 代码直接使用可以用sqlite3.h sqlite3.c,但是对于老的编译器来说并不好
  • 静态库使用 sqlite3.h sqlite3.lib
  • 动态库使用 sqlite3.h sqlite3.lib sqlite3.dll
:: 如果没有lib和exp文件可以使用如下指令生成
LIB /MACHINE:IX86 /DEF:sqlite3.def

官网下载使用

下载对应的库,源码,工具

动态库编译:

ps:如果没有特殊要求,可直接使用下载的sqlite-dll-*********.zip内的dll,那如果不放心就自己编译。
1、使用vs2010创建win32工程,然后选择DLL和空项目,正常情况下vc6-vs2015都支持
2、把sqlite3.c、sqlite3.h、sqlite3ext.h、sqlite3.def拷贝到工程源文件目录,前3个文件位于第一个zip,后一个文件位于后2个zip,用哪个就看你的目标环境。
3、然后通过工程的资源管理器把上述4个文件添加到工程中
4、修改工程配置,在配置属性–>c/c+±->预处理器–>预处理器定义,加入
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
5、修改工程配置,在配置属性–>链接器–>输入–>模块定义文件 加入sqlite3.def,然后编译即可。

静态库编译:

1、使用vs2010创建win32工程,然后选择静态库,去掉预编译头,正常情况下vc6-vs2015都支持
2、把sqlite3.c、sqlite3.h、sqlite3ext.h、sqlite3.def拷贝到工程源文件目录,前3个文件位于第一个zip,后一个文件位于后2个zip,用哪个就看你的目标环境。
3、然后通过工程的资源管理器把上述4个文件添加到工程中
4、修改工程配置,在配置属性–>c/c+±->预处理器–>预处理器定义,加入
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
5、修改工程配置,在配置属性–>链接器–>输入–>模块定义文件 加入sqlite3.def,然后编译即可。

例子

简单使用

#include "sqlite3.h"
#include <string>
#include <memory>
#include <stdio.h>

/* 防止sqlite中 sql注入转义 */
static std::string sql_escape(const std::string& s){
	std::string res;
	for(const auto& c : s){
		switch(c){
		case '\'':
			res.push_back(c);
		default:
			res.push_back(c);	
		}
	}
	return res;
}
int main(int argc,char* argv[]){
	sqlite3* db=nullptr;
	int err = sqlite3_open(R"(.\test.db3)",&db);
	if(err){ return -1;}
	std::unique_ptr<sqlite3,std::function<void(sqlite3*)>> defer_(db,[](sqlite3* db){sqlite3_close(db);});
	char buff[2048];
	sprintf(buff,"select count(1) from table_1 where key='%s';",sql_escape("' 1=1; --").c_str());
	char *errmsg;
	bool is_had = false;
	err = sqlite3_exec(db,buff,[](void* selfdata,int ct,char** va,char** co)->int {
		if(ct <= 0){return -1;}
		bool &res = *((bool*)(selfdata));
		res = atoi(va[0]) > 0;
		return 0;
	},&is_had,&errmsg);
	if(err){
		sprintf(stderr,"error:%s\n",errmsg);
		sqlite3_free(errmsg);
	}
	printf("result: %i\n",is_had);
	return 0;
}
上一篇:第二章 开始啦


下一篇:数据库连接工具Navicat查看并导出ER图&&数据库使用&&支持MySQL、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库