学习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应用的基本 ...
随机推荐
- ubuntu下eclipse scala开发插件(Scala IDE for Eclipse)安装
1. 环境介绍 系统:ubuntu16.04(不过和系统版本关系不大) elipse:Neon.1aRelease (4.6.1) 2. 插件介绍 Scala IDE for eclipse是elip ...
- emacs 新手笔记(一) —— 阅读【emacs tutorial】
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 [emacs tutorial]是熟悉 emacs 的入门资料.一共几十个命令,不需硬记,勤练即可. 翻页命 ...
- IE6下png格式图片显示问题
一开始是使用 _filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/bgBtn.png'); /* IE6 * ...
- 其实今天没有欲望..-MySQLi
hi 中午爽爽的游了会儿泳,但是下午把一拳超人看完了,竟然萌生不出学习的欲望了...强迫自己更新点东西吧,一会儿看书去. 1.MySQLi 二.MySQLi基于OOP的编程 2.1 使用解析 --基本 ...
- [麦先生]Laravel框架实现发送短信验证
今天在做到用户注册和个人中心的安全管理时,我借助实现第三方短信平台在Laravel框架中进行手机验证的设置; 由于我们做的是一个为客户提供医疗咨询和保健品网站,所以对客户个人隐私的保护显得尤为重要, ...
- MMORPG大型游戏设计与开发(客户端架构 part5 of vegine)
客户端异常捕获,是一件必然的事情,特别是在开发的时候就更需要这些有利于找出问题原因的捷径.区别于服务器的是,客户端基本上是以界面为主,你很难在正常运行程序的情况下进行一些输出的监视,如一些日志的记录. ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- Flappy Bird (Java实现)
运行效果: 代码: package bird; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; im ...
- Sphinx和coreseek检索引擎
Sphinx是检索英文用,coreseek是检索中文用. Sphinx(斯芬克斯)是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索 ...
- stunnel+CCProxy,搭建加密代理
总所周知,不可抗拒的特别有用心的原因,我们无法访问youtube,picasa,Twitter……国外优秀网站,很多人采用了代理服务器的方法访问. 如果您有一台放在海外的服务器,这个就好办了.下载一个 ...