C++操作SQLite数据库

2023-11-19

准备工作

在使用C++操作SQLite之前,需要获得sqlite3.h,sqlite3.lib,sqlite3.dll,大家可以在 这里 下载。并将这3个文件导入VC++工程中。其中sqlite3.dll文件放到Debug文件夹里。

SQLite API介绍

int sqlite3_open(char *path,sqlite3 **db)
这个函数打开数据库,第一个参数为sqlite文件的地址,第二个参数是sqlite3的指针的指针,也就是二级指针。
返回值为SQLITE_OK则成功打开数据库。
sqlite3_close(sqlite3 *db)
这个函数关闭数据库,参数是sqlite3的指针。
sqlite3_exec(sqlite3 *db,char *sql,int l,int m,int n)
这个函数执行SQL语句,如果我们不需要返回的结果就用这个函数执行SQL语句。第一个参数是sqlite3的指针,第二个参数为执行的SQL语句,后面3个参数我们不用关心,都设为0。
sqlite3_get_table(sqlite *db,char *sql,char ***result,int *row,int *column,int k);
这个函数执行查询语句,返回我们所需要的信息。第一个参数是sqlite的指针,第二个参数是SQL语句,第三个参数是返回的信息。row是返回的行数,column是返回的列数,最后一个参数设为0就行了。
因为我们使用的是GB2312,而SQLite使用的是utf-8,所以在使用中会出现中文乱码,为了解决这个问题,我介绍两个有用的函数
utf-8转换到GB3212
char* U2G(const char* utf8)
{
 int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
 wchar_t* wstr = new wchar_t[len+1];
 memset(wstr, 0, len+1);
 MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
 len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
 char* str = new char[len+1];
 memset(str, 0, len+1);
 WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
 if(wstr) delete[] wstr;
 return str;
}
GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
 int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
 wchar_t* wstr = new wchar_t[len+1];
 memset(wstr, 0, len+1);
 MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
 len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
 char* str = new char[len+1];
 memset(str, 0, len+1);
 WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
 if(wstr) delete[] wstr;
 return str;
}
这两个函数会用就行,需要引入windows.h头文件

我做的一个实战工程

在我的工程中,我将API封装了一下,便于操作。
我新建了一个叫做SQLiteHelper类  头文件如下
#if !defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_)
#define AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "sqlite3.h"
#include <windows.h>
class SQLiteHelper  
{
public:
	SQLiteHelper();
	virtual ~SQLiteHelper();
	sqlite3 *db;
	void execSQL(char *sql);
	char**rawQuery(char *sql,int *row,int *column,char **result);
	void openDB(char *path);
	void closeDB();

	
	


};

#endif // !defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_)

源文件如下
#include "SQLiteHelper.h"
#include <iostream.h>

//
// Construction/Destruction
//

SQLiteHelper::SQLiteHelper()
{
	
}

SQLiteHelper::~SQLiteHelper()
{

}
void SQLiteHelper::execSQL(char *sql)
{
	sqlite3_exec(db,sql,0,0,0);
}
char **SQLiteHelper::rawQuery(char *sql,int *row,int *column,char **result)
{
	sqlite3_get_table(db,sql,&result,row,column,0);
	return result;
}
void SQLiteHelper::openDB(char *path)
{
	int last=sqlite3_open(path,&db);
	if(SQLITE_OK!=last)
	{
		cout<<"打开数据库出错"<<endl;
		return;
		PostQuitMessage(0);
	}
}
void SQLiteHelper::closeDB()
{
	sqlite3_close(db);
}

我的主函数类如下
include <iostream.h>
#include <windows.h>
#include "sqlite3.h"
#include "SQLiteHelper.h"
#pragma comment(lib,"sqlite3.lib")
//utf-8转换到GB3212
char* U2G(const char* utf8)
{
 int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
 wchar_t* wstr = new wchar_t[len+1];
 memset(wstr, 0, len+1);
 MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
 len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
 char* str = new char[len+1];
 memset(str, 0, len+1);
 WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
 if(wstr) delete[] wstr;
 return str;
}
//GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
 int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
 wchar_t* wstr = new wchar_t[len+1];
 memset(wstr, 0, len+1);
 MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
 len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
 char* str = new char[len+1];
 memset(str, 0, len+1);
 WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
 if(wstr) delete[] wstr;
 return str;
}



void main()
{

	SQLiteHelper *help=new SQLiteHelper();
	help->openDB("d:\\zhycheng.db3");
	char *sql="insert into dota values(6,'zhycheng')";
	help->execSQL(sql);
	char *sql2="select * from dota";
	int row,col;
	char *eee="i";
	char **result=&eee;
	char **re=help->rawQuery(sql2,&row,&col,result);
	char *ll=U2G(re[(2+1)*col+1]);
	cout<<ll<<endl;
	help->closeDB();

}
这里我讲解一下re[(2+1)*col+1]
re是指向数组的指针。(2+1)为第3行,1表示第2列。

从中可以看出,我将“张译成”这个字符串读出了。大家注意,在写入的时候,如果要写入中文的话,就要将中文从GB2312转换到utf-8再写入,大家根据自己项目的需要,函数我已经给出了。

转载于:https://www.cnblogs.com/javaspring/archive/2012/06/15/2656000.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++操作SQLite数据库 的相关文章

  • Redis Geo:掌握地理空间数据的艺术

    欢迎来到我的博客 代码的世界里 每一行都是一个故事 Redis Geo 掌握地理空间数据的艺术 前言 Redis Geo基本概念 Geo模块的目的 工作原理 地理坐标系统
  • 神州信息一表通监管合规系统

    什么是 一表通 国家金融监督管理总局为进一步建立健全数据统计监管体系 规范数据报送指标体系 明确检测数据规则 而推行建立的一套新体系监管报送方式 提升校验准确性和信息安全性 近期 国家金融监督管理总局更是进一步加大推动 一表通 的实行试点范
  • python按列写入数据到excel

    要将数据按列写入 Excel 可以使用 Python 的 openpyxl 库 首先 需要安装 openpyxl 库 可以使用以下命令在终端或命令提示符中安装 pip install openpyxl 然后 可以按照以下步骤编写代码 1 导
  • 成为一个黑客,就按照这个路线来!

    前几天一个同学在聊天中提到毕业后想要从事网络安全方向的工作 虽然他本身也是学计算机的 但是又怕心有余而力不足 因为 从事网络安全方面的工作向来起点都比较高 大学里少有开设这类课程的 在学校能够学到的知识比较有限 网上的关于这方面课程的质量又
  • 【计算机毕业设计】病房管理系统

    当下 如果还依然使用纸质文档来记录并且管理相关信息 可能会出现很多问题 比如原始文件的丢失 因为采用纸质文档 很容易受潮或者怕火 不容易备份 需要花费大量的人员和资金来管理用纸质文档存储的信息 最重要的是数据出现问题寻找起来很麻烦 并且修改
  • Navicat 16 for MySQL:打造高效数据库开发管理工具

    随着数据的快速增长和复杂性的提升 数据库成为了现代应用开发中不可或缺的一部分 而在MySQL数据库领域 Navicat 16 for MySQL作为一款强大的数据库开发管理工具 正受到越来越多开发者的青睐 Navicat 16 for My
  • C 语言文件读取全指南:打开、读取、逐行输出

    C 语言中的文件读取 要从文件读取 可以使用 r 模式 FILE fptr 以读取模式打开文件 fptr fopen filename txt r 这将使 filename txt 打开以进行读取 在 C 中读取文件需要一点工作 坚持住 我
  • 【计算机毕业设计】网上拍卖系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本网上拍卖系统就是在这样的大环境下诞生 其可以帮助使用者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管理人员
  • 38条Web测试经验分享

    1 页面链接检查 每一个链接是否都有对应的页面 并且页面之间切换正确 可以使用一些工具 如LinkBotPro File AIDCS HTML Link Validater Xenu等工具 LinkBotPro不支持中文 中文字符显示为乱码
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • 【计算机毕业设计】电影播放平台

    电影播放平台采用B S架构 数据库是MySQL 网站的搭建与开发采用了先进的java进行编写 使用了springboot框架 该系统从两个对象 由管理员和用户来对系统进行设计构建 主要功能包括 个人信息修改 对用户 电影分类 电影信息等功能
  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 【计算机毕业设计】二手图书交易系统

    随着世界经济信息化 全球化的到来和互联网的飞速发展 推动了各行业的改革 若想达到安全 快捷的目的 就需要拥有信息化的组织和管理模式 建立一套合理 动态的 交互友好的 高效的二手图书交易系统 当前的信息管理存在工作效率低 工作繁杂等问题 基于
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • 【计算机毕业设计】springbootstone音乐播放器的设计与实现

    随着我国经济的高速发展与人们生活水平的日益提高 人们对生活质量的追求也多种多样 尤其在人们生活节奏不断加快的当下 人们更趋向于足不出户解决生活上的问题 stone音乐播放器展现了其蓬勃生命力和广阔的前景 与此同时 为解决用户需求 stone
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • Oracle EBS AP发票导入 API Rejection List 第二部分

    Oracle EBS AP发票导入 API Rejection List 第二部分 The report lists the reason the invoice could not be imported and prints a bri
  • 30天精通Nodejs--第二十天:express-操作mysql

    目录 前言 安装依赖并配置MySQL连接 安装mysql2库 配置连接信息 在Express应用中使用MySQL 结合Express路由实现CRUD操作 整合到主应用 结语 前言 在Node js中使用Expre
  • 在 OS X 上的 virtualenv 中安装 scrapy 加密时发生错误 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在安装 scrapypip in virtualenv on OS X 10 11 当它安装密码学时 它说 buil
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC

随机推荐

  • 测试自动化框架平台选型汇总篇

    本文介绍测试自动化常用的框架和平台 语言为python或javascript 无java UI自动化 python pytest playwright 文章 http t csdn cn 2dMF5 python selenium unit
  • 计算机英语·NO

    N n 换行符 name demanding 名字恢复 name mangling 名字毁坏 nanoseconds ns 纳秒 neg operations neg操作 negation two s complement 非 二进制补码的
  • 【电商】电商后台设计—订单中心

    订单系统连接了用户和商家 用户可以通过订单看到商品购买详情 商家则可以通过订单看到购买用户信息等 而整个订单系统囊括了许多模块 如订单生成 订单计算等 一 订单的生成与状态 1 下单过程 电商下单的过程相信大家都不陌生 我们以从购物车下单为
  • laravel路由

    路由 在laravel中 定义路由的地方在routes web php文件中 在使用laravel前必须先定义路由 然后才能在浏览器中访问 routes文件夹中还有一个api php 用于定义api路径 最简单的路由 Route get f
  • GPIO_Speed_50MHz的值是多少

    在STM32底层库中 使用GPIO Speed 50MHz等来表示输出口的最高频率 那么他的值是多少 查看了一下定义 是个枚举 后来查了一下枚举才知道 当枚举中的某个元素备赋值后 从该元素往后是递增的 即1 2 3 当赋给指定的偏移地址后
  • react中props详解

    1 props的基本使用 react组件之间的传值 是离不开props的 代码展示 export default class Parent extends Component render return div h3 我是Parent组件
  • python中if else语句用法_Python条件语句详解:if、else、switch都有了

    01 if条件语句 if语句用于检测某个条件是否成立 如果成立 则执行if语句内的程序 否则 跳过if语句 执行后面的内容 if语句的格式如下 if 表达式 语句1 else 语句2 if语句的执行过程如下 如果表达式的布尔值为真 则执行语
  • PyAutoGui图像操作(一):图像定位方式及返回

    一 PyAutoGui介绍 PyAutoGUI是Python功能强大的UI自动化库 其目的是可以用程序自动控制鼠标和键盘操作 主要用来实现PC端的UI自动化 有鼠标控制 键盘操作 屏幕截图 图片定位 消息对话框 窗口操作等功能 有倒计时 鼠
  • 使用IntelliJ IDEA开发Java Web HelloWorld

    下载Tomcat 首先 下载Apache Tomcat并解压到本地计算机 可存放于任何位置 tomcat官网 https tomcat apache org 下载稳定版版本即可 下载解压好 启动bin下的startup bat文件 访问 h
  • 图神经网络调研

    图神经网络调研 图神经网络简介 应用场景 典型模型 GCN PinSAGE GraphSAGE GAT 图神经网络与知识图谱 异质图和同质图 部分参考链接 最近在做一些图神经网络相关的课题 做了些调研 简单记录一下想法和收获 图神经网络简介
  • OSFormer阅读笔记

    目录 前言 1 模型的特点 2 模型结构 2 1 CNN backbone 2 2 位置感知Transformer LST 2 3 粗细特征融合 CFF 2 4 动态伪装实例归一化 DCIN 2 5 损失函数 3 可视化分析 参考 前言 O
  • JAVA面向过程(二十六) if-else if-else多选择结构

    语法结构 1 2 3 4 5 6 7 8 9 10 if 布尔表达式1 语句块1 else if 布尔表达式2 语句块2 else if 布尔表达式n 语句块n else 语句块n 1 当布尔表达式1为真时 执行语句块1 否则 判断布尔表达
  • 微信小程序反编译

    安装逍遥安卓模拟器 安装node js不作细述 按提示安装即可 安装完成后在命令窗口输入 node v 能查看到版本号即可 打开脚本地址下载反编译脚本 解压 安装依赖 在脚本目录下shift 鼠标右键 打开命令窗口 逐条命令安装 npm i
  • python requests请求终止,python中requests小技巧

    关于 Python requests 在使用中 总结了一些小技巧把 记录下 1 保持请求之间的Cookies 我们可以这样做 2 请求时 会加上headers 一般我们会写成这样 唯一不便的是之后的代码每次都需要这么写 代码显得臃肿 所以我
  • opencv+mfc应用程序依赖库

    msvcp110 dll msvcr110 dll vccorlib110 dll和它统计目录下的所有库 https blog csdn net seu nuaa zc article details 53525569 ucrtbased
  • PC端:hover 样式在移动端的兼容处理

    写了一个轮播 有hover效果 PC端正常显示 移动端就出现一些问题 点击之后滑动到下一张 上一张有hover效果 要点击其他地方才会消失 解决方案 参考文章CSS hover 样式在移动端的兼容处理 链滴 media hover hove
  • mysql唯一索引如何实现,从基础到源码统统帮你搞定

    面试失败之后 在这之后的很长一段时间后 他没敢再去面试 觉得自己太丢人 技术太差不敢去谈论技术话题 后来他渐渐开始看网上的文章 知道要刷leetcode 看面经 然后之后一年多的时间 边上课 边刷题 边看知识点 直到去年中旬 第二次开始面试
  • ImportError: cannot import name ‘soft_unicode‘ from ‘markupsafe‘

    打开jupyter notebook报下面的错误 这里说是markupsafe有错误 查看一下是否安装了这个包 pip show markupsafe 已经有了这个包 但是还报错 经过测试发现这个2 1 3版本不兼容 回退到2 1 0才行
  • 一文搞定Nginx的压缩、黑白名单、防盗链、零拷贝、跨域、双机热备等知识

    点击上方 Java基基 选择 设为星标 做积极的人 而不是积极废人 每天 14 00 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框
  • C++操作SQLite数据库

    准备工作 在使用C 操作SQLite之前 需要获得sqlite3 h sqlite3 lib sqlite3 dll 大家可以在 这里 下载 并将这3个文件导入VC 工程中 其中sqlite3 dll文件放到Debug文件夹里 SQLite