【SQLite】教程07-C/C++上使用SQLite3
1、配置好C/C++项目环境



2.源码
1 #include <iostream>
2 #include <vector>
3 #include <string>
4 #include "sqlite3.h"
5 using namespace std;
6
7 //NotUsed:sqlite3_exec()的第4个参数提供的数据
8 //argc:字段数量
9 //argv:元素内容的数组
10 //azColName:字段名称的数组
11 static int callback(void *NotUsed, int argc, char **argv, char **azColName)
12 {
13 for (int i = 0; i < argc; i++)
14 {
15 //printf("azColName=%s\n", azColName[i]);
16 //printf("argv=%s\n", argv[i] ? argv[i] : "NULL");
17 printf("%s=%s\n", azColName[i], argv[i] ? argv[i] : "NULL");
18 }
19 printf("\n");
20 return 0;
21 }
22
23 int main()
24 {
25 //------------------------------------------------------------创建、打开数据库----------------------------------------------------------------
26 sqlite3 *db = NULL; // 一个打开的数据库实例
27 const char * path = "..\\Test-SQLite\\Test.db";
28 int result = sqlite3_open(path, &db);
29 if (result == SQLITE_OK)
30 {
31 std::clog << "打开数据库连接成功!" << endl;
32 }
33 else
34 {
35 std::clog << "打开数据库连接失败!" << endl;
36 exit(0);
37 }
38 //------------------------------------------------------------创建表----------------------------------------------------------------
39 char *sql;
40 char *zErrMsg = 0;
41 sql = "CREATE TABLE COMPANY(" \
42 "ID INT PRIMARY KEY NOT NULL," \
43 "NAME TEXT NOT NULL," \
44 "AGE INT NOT NULL," \
45 "ADDRESS CHAR(50)," \
46 "SALARY REAL );";
47
48 int rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
49
50 if (rc != SQLITE_OK)
51 {
52 fprintf(stderr, "SQL error: %s\n", zErrMsg);
53 sqlite3_free(zErrMsg);
54 }
55 else
56 {
57 fprintf(stdout, "表格创建成功!\n");
58 }
59 //--------------------------------------------------------------添加记录--------------------------------------------------------------------
60 sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
61 "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
62 "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \
63 "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " \
64 "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
65 "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
66 "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
67 "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
68 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
69 if (rc != SQLITE_OK)
70 {
71 fprintf(stderr, "SQL error: %s\n", zErrMsg);
72 sqlite3_free(zErrMsg);
73 }
74 else
75 {
76 fprintf(stdout, "记录创建成功!\n");
77 }
78 //--------------------------------------------------------------查询表--------------------------------------------------------------------
79 sql = "SELECT * from COMPANY";
80 //处理每个记录将会用到这个回调callback
81 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
82
83 if (rc != SQLITE_OK)
84 {
85 fprintf(stderr, "SQL error: %s\n", zErrMsg);
86 sqlite3_free(zErrMsg);
87 }
88 else
89 {
90 fprintf(stdout, "查询操作成功!\n");
91 }
92 //--------------------------------------------------------------更新表--------------------------------------------------------------------
93 sql = "UPDATE COMPANY set SALARY = 88888.00 where ID=1; " \
94 "SELECT * from COMPANY";
95 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
96 if (rc != SQLITE_OK)
97 {
98 fprintf(stderr, "SQL error: %s\n", zErrMsg);
99 sqlite3_free(zErrMsg);
100 }
101 else
102 {
103 fprintf(stdout, "更新表格成功!\n");
104 }
105 //--------------------------------------------------------------查询表 ID=1--------------------------------------------------------------------
106 sql = "SELECT * from COMPANY where ID=1";
107 //处理每个记录将会用到这个回调callback
108 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
109
110 if (rc != SQLITE_OK)
111 {
112 fprintf(stderr, "SQL error: %s\n", zErrMsg);
113 sqlite3_free(zErrMsg);
114 }
115 else
116 {
117 fprintf(stdout, "查询操作成功!\n");
118 }
119 //--------------------------------------------------------------删除记录 ID=2--------------------------------------------------------------------
120 sql = "DELETE from COMPANY where ID=2; " \
121 "SELECT * from COMPANY";
122 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
123 if (rc != SQLITE_OK)
124 {
125 fprintf(stderr, "SQL error: %s\n", zErrMsg);
126 sqlite3_free(zErrMsg);
127 }
128 else {
129 fprintf(stdout, "删除记录成功!\n");
130 }
131 //--------------------------------------------------------------查询表--------------------------------------------------------------------
132 sql = "SELECT * from COMPANY";
133 //处理每个记录将会用到这个回调callback
134 rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
135
136 if (rc != SQLITE_OK)
137 {
138 fprintf(stderr, "SQL error: %s\n", zErrMsg);
139 sqlite3_free(zErrMsg);
140 }
141 else
142 {
143 fprintf(stdout, "查询操作成功!\n");
144 }
145 //--------------------------------------------------------------关闭数据库--------------------------------------------------------------------
146 sqlite3_close(db);
147
148 system("pause");
149 return 0;
150 }
结果:


4、编码转换
Sqlite的编码默认为UTF-8编码,而vc++工程中所编写的SQL语句,一般是Unciode。由于编码不一致会导致乱码,下面这段程序可以解决:
1).sql语句由GB2312转为UTF-8再用sqlite3_exec()查询
2).查询结果在callback()中由UTF-8转为GB2312再输出
下面是编码转换函数:
//UTF-8到GB2312的转换
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;
}
string U2G(string strutf8)
{
char cUTF8[500];
sprintf(cUTF8, "%s", strutf8.c_str());
string strGB2312;
strGB2312 = U2G_(cUTF8);
return strGB2312;
}
int Tools_Use_Record(string strToolName);
//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;
}
string G2U(string strGB2312)
{
char cGB2312[500];
sprintf(cGB2312, "%s", strGB2312.c_str());
string strutf8;
strutf8 = G2U_(cGB2312);
return strutf8;
}
5、查询注意
以INTEGER作为条件用=
select * from 表名 where 序号=55
以TEXT作为条件用like
select * from 表名 where 姓名 like '里海'
下面这种写法会出错
select * from 表名 where 姓名='里海'
【SQLite】教程07-C/C++上使用SQLite3的更多相关文章
- [译]Vulkan教程(07)物理设备和队列家族
[译]Vulkan教程(07)物理设备和队列家族 Selecting a physical device 选择一个物理设备 After initializing the Vulkan library ...
- 【GStreamer开发】GStreamer播放教程07——自定义playbin2的sink
目标 通过手动选择音频和视频的sink,playbin2可以进一步定制.这允许使用playbin2的应用在解码后可以自行做最终的渲染和显示.本教程展示了: 如何替换playbin2选择的sink 如何 ...
- 黑马lavarel教程---7、文件上传
黑马lavarel教程---7.文件上传 一.总结 一句话总结: 在laravel里面实现文件的上传是很简单的,压根不用引入第三方的类库,作者把上传作为一个简单的http请求看待的. 1.在lavar ...
- Coding 初级教程(二)——上传已有项目
Coding 初级教程(二)——上传已有项目 [摘要:方针读者 :已具有 Coding.net 的账号. 本文首要先容若何把项目上传到 Coding.net 上. 分两种环境,一种是项目已归入到 gi ...
- Xamarin SQLite教程Xamarin.iOS项目添加引用
Xamarin SQLite教程Xamarin.iOS项目添加引用 使用直接方式访问SQLite数据库,需要将System.Data和Mono.Data.SQlite库导入到创建的项目中.下面将分别讲 ...
- Xamarin SQLite教程数据库访问与生成
Xamarin SQLite教程数据库访问与生成 在本教程中,我们将讲解如何开发SQLite相关的App.在编写程序前,首先需要做一些准备工作,如了解Xamarin数据库访问方式,添加引用,构建使用库 ...
- SQLite教程
SQLite教程 http://www.runoob.com/sqlite/sqlite-date-time.html SQLite管理工具http://www.sqliteexpert.com/do ...
- android安卓 SQLite教程:内部架构及SQLite使用办法
SQLite 介绍 SQLite一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.由于JDBC不适合手机这种内存受限设备,所以Android开发人员需要学习新的API ...
- [原创] SQLite数据库使用清单(上)
1. 介绍 1.1 安装 访问 SQLite 下载页面,从 Windows 区下载预编译的二进制文件. 您需要下载 sqlite-shell-win32-*.zip 和 sqlite-dll-win3 ...
随机推荐
- layui处理表单/按钮进行多次提交
在一个项目中,我们最频繁的操作是CRUD,所以一定有涉及到按钮的操作.比如:确认保存,确认编辑,确认删除等等.所以,为了避免表单进行多次提交就显得特别地重要. 代码实现 知识点 $(':button' ...
- JVM垃圾回收的三种方式
* 垃圾回收有三种方式 * 一.清除:将需要回收对象的内存空间存放在内存列表中,当需要为新对象分配内存的时候,就会从内存列表中拿取空间分配.不过这种分配方式有两个缺点 * 第一个缺点是内存空间碎片化, ...
- 分布式ID
需求 全局唯一 高性能 高可用 简单易用 UUID 优点: 唯一 不依赖于任何第三方服务 缺点: 是字符串类型而非数字,不满足数字ID的需求 字符串太长了,DB查询效率受影响 数据库自增ID 如果使用 ...
- Vulnerability: Cross Site Request Forgery (CSRF)
CSRF跨站请求伪造 这是一种网络攻击方式,也被称为one-click attack或者session riding 攻击原理 CSRF攻击利用网站对于用户网页浏览器的信任,挟持用户当前已登陆的Web ...
- 使用C#进行数据库增删改查ADO.NET(二)
这节接着讲用C#进行数据库CRUD,高级部分. 事务: 事务是执行一批sql语句,如果中途失败,全部回滚,数据不会受影响,中途没有出错则会提交事务,真正对数据进行修改.C#提供了SqlTransac ...
- 语音降噪论文“A Hybrid Approach for Speech Enhancement Using MoG Model and Neural Network Phoneme Classifier”的研读
最近认真的研读了这篇关于降噪的论文.它是一种利用混合模型降噪的方法,即既利用了生成模型(MoG高斯模型),也利用了判别模型(神经网络NN模型).本文根据自己的理解对原理做了梳理. 论文是基于" ...
- [bug] IDEA 创建springboot项目 “Initialization failed for ‘https://start.spring.io‘
原因 网络问题,更换阿里云服务器,或自己搭建服务器 参考 https://blog.csdn.net/soulofball/article/details/107157872 https://blog ...
- openshift 3.11 安装部署
openshift 3.11 安装部署 openshift安装部署 1 环境准备(所有节点) openshift 版本 v3.11 1.1 机器环境 ip cpu mem hostname OSsys ...
- Mysql数据库基础增删改查常用语句命令
Mysql增删改查常用语句命令 一.增删改查语句总览 创建: create(创建数据库) 增:insert(插入表数据) 删:drop.delete(删除表.删除表数据) 改:update.alter ...
- linux进阶之计划任务及压缩归档
本节内容 1. at一次性计划任务(atd) at 时间点 command ctrl+d:保存 -l:查看计划任务 atrm:删除计划任务 atq:查看计划任务 2. crontab周期性计划任务(c ...