学习SQLite之路(五) C/C++ SQLite开发实例
介绍一种乌班图中使用sqlite的用法,非常简单,下面的例子是在乌班图12.04中实现的:
1,先安装两个东西:
sudo apt-get install sqlite sqlite3
sudo apt-get install libsqlite3-dev // 不然可能会报 没有头文件 sqlite3.h
2,C/C++接口:一般用到下面这三个,详情请参考sqlite官方文档。
(1)sqlite3_open(const char *filename, sqlite3 **ppDb):
打开一个数据库连接, 返回sqlite3对象。
(2)sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg):
解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。
(3)sqlite3_close(sqlite3*):
关闭之前打开的数据库。
3、打开数据库并创建表
#include<stdio.h>
#include<sqlite3.h> // 暂时先不管
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db); // 打开数据库
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} sql = "create table company(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE TEXT NOT NULL, ADDRESS CHAR(50))"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg); // 执行上面sql中的命令
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "create table successfully\n");
} sqlite3_close(db);
return ;
}
运行:需要链接sqlite3库,下面的其他操作也是如此。
gcc sqlite3test.c -o create -l sqlite3
4、插入数据:
#include<stdio.h>
#include<sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} // sql = "create table company(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE TEXT NOT NULL, ADDRESS CHAR(50))"; sql = "insert into company(ID, NAME, AGE, ADDRESS) values(1, 'Paul', 25, 'USA');\
insert into company(ID, NAME, AGE, ADDRESS) values(, 'James', , 'JAP');\
insert into company(ID, NAME, AGE, ADDRESS) values(, 'Yao', , 'CHA');\
insert into company(ID, NAME, AGE, ADDRESS) values(, 'kobe', , 'USA');"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg);
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "insert table successfully\n");
} sqlite3_close(db);
return ;
}
5、查询数据:
注意:这里的callback函数,是sqlite的一个回调函数,格式如下(必须按照这个格式):
int sqlite_callback(
void* NotUsed, /* 由 sqlite3_exec() 的第四个参数传递而来 */
int argc, /* 表的列数 */
char** argv, /* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */
char** azColName /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */
);
执行sqlite3_exec() 时作为参数传进去。
说明:
参数:
NotUsed:由sqlite3_exec传递的初始化参数
argc:表头的列数
azColName:表头的名字数组指针,在我们的例子就是指向{ID, NAME, AGE, ADDRESS}的指针
argv:表头的数据数组指针
返回值:
1:中断查找
0:继续列举查询到的数据
#include<stdio.h>
#include<sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} sql = "select * from company;"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg);
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "select table successfully\n");
} sqlite3_close(db);
return ;
}
请看输出:

6、更新并查询:
#include<stdio.h>
#include<sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} sql = "update company set ADDRESS = 'RUS' where ID = 3;\
select * from company;"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg);
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "update table successfully\n");
} sqlite3_close(db);
return ;
}
7、删除并查询:
#include<stdio.h>
#include<sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i = ;
for(i = ; i < argc; i++)
{
printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
} printf("\n");
return ;
} int main()
{
sqlite3* db;
char *zErrMsg = ;
int rc;
char *sql; rc = sqlite3_open("test.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
// exit(0);
return -;
}
else
{
fprintf(stderr,"open database succeddfully\n");
} sql = "delete from company where ID = 2;\
select * from company;"; rc = sqlite3_exec(db, sql, callback, , &zErrMsg);
if(SQLITE_OK != rc)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
else
{
fprintf(stdout, "delete table successfully\n");
} sqlite3_close(db);
return ;
}
8,上面的例子可在下面找到:
https://github.com/xcywt/MySQLite
学习SQLite之路(五) C/C++ SQLite开发实例的更多相关文章
- 我的VSTO之路(五):Outlook初步开发之联系人扩展
原文:我的VSTO之路(五):Outlook初步开发之联系人扩展 上一讲我们完成对Word的介绍,文本开始,我将着重介绍Outlook.Outlook是微软Office中一个非常实用的工具,尤其在一个 ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- javaweb学习总结(二十五)——jsp简单标签开发(一)
一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...
- SpringCloud学习成长之路 五 路由器网关
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...
- UNP学习笔记(第五章 TCP客户/服务程序实例)
我们将在本章使用前一章中介绍的基本函数编写一个完整的TCP客户/服务器程序实例 这个简单得例子是执行如下步骤的一个回射服务器: TCP回射服务器程序 #include "unp.h" ...
- 学习SQLite之路(三)
20160616更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite PRAGMA:可以用在 SQLite 环境内控制 ...
- android安卓 SQLite教程:内部架构及SQLite使用办法
SQLite 介绍 SQLite一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.由于JDBC不适合手机这种内存受限设备,所以Android开发人员需要学习新的API ...
- [Sqlite]-->Java采用jdbc联系Sqlite各种特定的工艺数据库的数据操作
引: 1, Sqlite在Windows.Linux 和 Mac OS X 上的安装过程 2.嵌入式数据库的安装.建库.建表.更新表结构以及数据导入导出等等具体过程记录 3,嵌 ...
- SQLite 数据类型(http://www.w3cschool.cc/sqlite/sqlite-data-types.html)
SQLite 数据类型 SQLite 数据类型是一个用来指定任何对象的数据类型的属性.SQLite 中的每一列,每个变量和表达式都有相关的数据类型. 您可以在创建表的同时使用这些数据类型.SQLite ...
- 学习WCF之路,长期更新
我学习WCF之路:创建一个简单的WCF程序 为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本 ...
随机推荐
- MySQL 调优基础(四) Linux 磁盘IO
1. IO处理过程 磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言.数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以wri ...
- Servlet/JSP-07 Session应用
Session应用 一. 避免表单重复提交 1. 表单重复提交的情况 ①在表单提交到一个 Servlet,而 Servlet 又通过请求转发的方式响应了一个 JSP 或者 HTML 页面,此时浏览器地 ...
- iOS 实现Tabbarcontroller中间自定义样式 最简单的方法
先上图: 如果我们要实现中间按钮自定义样式,方法应该蛮多,这里介绍一种最简单的. 1.创建类继承:UITabBarController,如下代码都是写在该类的 .m文件里 2.定义最中间的自定义样式, ...
- 其实今天没有欲望..-MySQLi
hi 中午爽爽的游了会儿泳,但是下午把一拳超人看完了,竟然萌生不出学习的欲望了...强迫自己更新点东西吧,一会儿看书去. 1.MySQLi 二.MySQLi基于OOP的编程 2.1 使用解析 --基本 ...
- RecycleView + CardView 控件简析
今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...
- 单机搭建Android开发环境(三)
单机搭建Android开发环境,第一篇重点介绍了如何优化Windows 7系统,以提高开发主机的性能并延长SSD的使用寿命.第二篇重点介绍了基于VMWare安装64位版的Ubuntu 12.04,并安 ...
- lgy -oracle
PL/SQL Developer 和 instantclient客户端安装配置(图文) 一: PL/SQL Developer 安装 下载安装文件安装,我这里的版本号是PLSQL7.1.4.1391, ...
- Zygote进程【3】——SystemServer的诞生
在ZygoteInit的main()方法中做了几件大事,其中一件便是启动Systemserver进程,代码如下: @/frameworks/base/core/Java/com/Android/int ...
- eclipse打不开,报错 "java was started with exit code=13"
刚才打开eclipse时,出现如上的报错窗口. 1.查看java 版本,发现是1.8版本,记得自己之前手动安装的java应该是1.7或者更低的版本.让我想起之前系统总是会提醒java有更新,最近就没有 ...
- crontab日常使用梳理
在日常的运维工作中,对crontab定时任务的制定是再寻常不过的了.根据以往的使用经验梳理如下: 基本格式 :* * * * * command分 时 日 月 周 命令解释:第1列表示分钟1-59 每 ...