学习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应用的基本 ...
随机推荐
- HTML5游戏开发引擎,初识CreateJS
CreateJS为CreateJS库,可以说是一款为HTML5游戏开发的引擎.打造 HTML5 游戏,构建新游戏,提供构建最新 HTML5 的技术.你可以通过这个网站学习如何构建跨平台和跨终端游戏.这 ...
- sql server 警报管理,实时监听数据库动向,运筹帷幄之中
工作这么多年了,无论是身边的同学还是同事,发现只要搞程序员的都有一个通病---懒.懒到谁都不愿意加班,尤其是"义务"加班.即使大家都不愿意加班,但是很多时候项目赶着上线或者上线之后 ...
- Linux学习--------二
Linux基础知识 Linux文件系统为一个倒转的单根树状结构文件系统的根为"/" 文件系统严格区分大小写路径 使用"/"分割(windows使用"\ ...
- 烂泥:【解决】修改LVM卷组名重启系统后,无法进入进入系统
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 一台服务器系统已经安装完毕,但是LVM的卷组vg使用的是默认的VolGroup名称,使用起来感觉不舒服,打算把这个卷组名称修改为vg. 先来查看系统中有 ...
- 004.UDP--拼接UDP数据包,构造ip头和udp头通信(使用原始套接字)
一.大致流程: 建立一个client端,一个server端,自己构建IP头和UDP头,写入数据(hello,world!)后通过原始套接字(SOCK_RAW)将包发出去. server端收到数据后,打 ...
- javascript日历控件
以前要用到日历控件都是直接从网上下载一套源码来使用,心里一直有个梗,就是想自己动手写一个日历控件,最近刚好来了兴趣,时间上也允许,于是自己摸索写了一个,功能还算完善,界面就凑合了.可能最值得说的一点就 ...
- golang和vim-go安装配置
一.Golang安装 1.下载golang安装包http://golangtc.com/download,我这里下载的是go1.6rc2.linux-amd64.tar.gz. 2.解压到安装目录,我 ...
- Ajax请求利用jsonp实现跨域
跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资 ...
- NET Core中实现一个Token base的身份认证
NET Core中实现一个Token base的身份认证 注:本文提到的代码示例下载地址> How to achieve a bearer token authentication and au ...
- 【2016-10-12】【坚持学习】【Day3】【责任链模式】
今天学习责任链模式 例子: 采购审批系统 采购单需要经过不同人审批 采购价格<500 部门经理审批 采购价格<1000 部门主任审批 采购价格<2000 副总审批 采购价格<5 ...