Linux下用到数据库sqlite3

最近在Linux下用到数据库sqlite3,于是起了拖欠地点的读。 

  1. 引言 

俺们当即篇小说要讲述了怎么着在C/C++语言中调用
sqlite 的函数接口来兑现对数据库的管制, 
包创建数据库、创设表格、插入数据、查询数据、删除数据等。 

  1. 说明 

此间大家借而你曾经编译好了sqlite的库文件

libsqlite3.a
libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6
pkgconfig 
跟可执行文件
: sqlite3 

咱还借用要你的sqlite3的设置目录在
/usr/local/sqlite3 目录下。 
倘未是,我们可以这样做,将您的安装文件复制到
/usr/local/sqlite3 这多少个目录, 
诸如此类大家正是下边的操作中越来越统一,从而缩小失误的票房价值 

例如:[root@localhost
home]# cp -rf sqlite-3.3.8-ix86/ /usr/local/sqlite3 
这边要
/home/sqlite-3.3.8-ix86/
是你的安目录,也就是说你的sqlite原来就是安在此处 

这样以后,我们的sqlite3的仓库文件目录是:/usr/local/sqlite3/lib 
可执行文件
sqlite3 的目录是: /usr/local/sqlite3/bin 
头文件
sqlite3.h 的目录是: /usr/local/sqlite3/include 

目前始我们的linux下sqlite3编程的一起。 

  1. 开始 

此间大家本进展一个测试。 
明天我们来形容个C/C++程序,调用
sqlite 的 API 接口函数。 

脚是一个C程序的事例,呈现怎么用
sqlite 的 C/C++ 接口.
数据库的名由第一只参数取得且第二只参数或更多的参数是 SQL 执行语句.
这多少个函数调用sqlite3_open() 在 16 行打开数据库,并且sqlite3_close() 在
25 行关闭数据库连接。 

[root@localhost
temp]# vi opendbsqlite.c 
按照下 i
键切换来输入形式,输入下列代码: 

// name:
opendbsqlite.c 

// This prog
is used to test C/C++ API for sqlite3.It is very simple,ha! 

// Author :
zieckey All rights reserved. 

// data :
2006/11/13 

#include
<stdio.h> 

#include
<sqlite3.h> 

int main(
void ) 

sqlite3
*db=NULL; 

char
*zErrMsg = 0; 

int rc; 

//打开指定的数据库文件,倘若非在将成立一个同名的数据库文件 

rc =
sqlite3_open(“zieckey.db”, &db); 

if( rc ) 

fprintf(stderr,
“Can’t open database: %s\n”, sqlite3_errmsg(db)); 

sqlite3_close(db); 

exit(1); 

else
printf(“You have opened a sqlite3 database named zieckey.db
successfully!\nCongratulations! Have fun ! ^-^ \n”); 

sqlite3_close(db);
//关闭数据库 

return 0; 

退,保存。(代码输入好后,按下
Esc 键,然后输入: :wq ,回车就好拉) 

吓关,现在编译:[root@localhost
temp]# gcc opendbsqlite.c -o db.out 
抑或遭遇这么的题材: 
[root@localhost
temp]# gcc opendbsqlite.c -o db.out 
opendbsqlite.c:11:21:
sqlite3.h: 没有这个文件或者目录 
opendbsqlite.c: In
function `main’: 
opendbsqlite.c:19:
`sqlite3′ undeclared (first use in this function) 
opendbsqlite.c:19:
(Each undeclared identifier is reported only once 
opendbsqlite.c:19:
for each function it appears in.) 
opendbsqlite.c:19:
`db’ undeclared (first use in this function) 

立刻是由没找到头文件的故。 

或是会遇见类似这样的题目: 
[root@localhost
temp]# gcc opendbsqlite.c -o db.out 

/tmp/ccTkItnN.o(.text+0x2b):
In function `main’: 

: undefined
reference to `sqlite3_open’ 

/tmp/ccTkItnN.o(.text+0x45):
In function `main’: 

: undefined
reference to `sqlite3_errmsg’ 

/tmp/ccTkItnN.o(.text+0x67):
In function `main’: 

: undefined
reference to `sqlite3_close’ 

/tmp/ccTkItnN.o(.text+0x8f):
In function `main’: 

: undefined
reference to `sqlite3_close’ 

collect2: ld
returned 1 exit status 

即刻是单没找到库文件之题目。 

脚我们发轫解决这个题材。 

由于拔取了用户自己之库文件,所用应当指明所用到之堆栈,大家得这么编译: 

[root@localhost
temp]# gcc opendbsqlite.c -o db.out -lsqlite3 

本人之所以用
-lsqlite3 选项就足以了(前边我们另外库文件是 libsqlite3.so.0.8.6 等, 

破除后面的lib和后的版标志,就剩下
sqlite3 了所以是 -lsqlite3 )。 

比方我们当编译安装之时段,选取了装路径,例如这样的话: 

……. 

#
../sqlite/configure –prefix=/usr/local/sqlite3 
# make 

……. 

这般编译安装时,sqlite的库文件将会变卦于
/usr/local/sqlite3/lib 目录下 
sqlite的腔文件将会晤转移于
/usr/local/sqlite3/include 目录下 

这儿编译还要指定库文件路径,因为系统默认的路子没有含
/usr/local/sqlite3/lib 

[root@localhost
temp]# gcc opendbsqlite.c -o db.out -lsqlite3
-L/usr/local/sqlite3/lib 

若果还百般吧,可能还用指定头文件
sqlite3.h 的门径,如下: 

[root@localhost
temp]# gcc opendbsqlite.c -o db.out -lsqlite3 -L/usr/local/sqlite3/lib
-I/usr/local/sqlite3/include 

诸如此类编译应该就是可了
,运行: 

[root@localhost
temp]# ./db.out 
./db.out:
error while loading shared libraries: libsqlite3.so.0: cannot open
shared object file: No such file or directory 

运转是可能会现出类似下边的荒谬。 

这么些题材因刚刚编译的时候没有选静态编译,那么以默认的编译就动态编译的。 
动态编译后,由于可执行文件在运作时若调用系统库文件, 
这就是说顺系统默认的库文件搜索路径搜索,就可能寻不顶大家本所要的库文件。 
招出现”error while loading shared libraries” 等不当。 

俺们好如此解决: 
格局一致:静态编译 
于编译时累加
-static 参数,例如 
[root@localhost
temp]# gcc opendbsqlite.c -o db.out -lsqlite3 -L/usr/local/sqlite3/lib
-I/usr/local/sqlite3/include -static 
[root@localhost
temp]# ll 
总用量
1584 
-rwxr-xr-x 1
root root 1596988 11月 13 10:50 db.out 
-rw-r–r– 1
root root 614 11月 13 10:31 opendbsqlite.c 
可看看输出文件
db.out ,其大小也: 1596988k 
运行,好了,没有出现错误 
[root@localhost
temp]# ./db.out 
You have
opened a sqlite3 database named zieckey.db successfully! 
Congratulations!
Have fun ! ^-^ 

计二:重新配置系统环境变量
LD_LIBRARY_PATH 
这时候要指定
libsqlite3.so.0 库文件的途径,也即使是布局类别环境变量 LD_LIBRARY_PATH
, 
假使系统会找到
libsqlite3.so.0 。 

去掉 -static
,在编译: 
[root@localhost
temp]# gcc opendbsqlite.c -o db.out -lsqlite3 -L/usr/local/sqlite3/lib
-I/usr/local/sqlite3/include 
[root@localhost
temp]# ll 
总用量 36 
-rwxr-xr-x 1
root root 12716 11月 13 10:56 db.out 
-rw-r–r– 1
root root 614 11月 13 10:31 opendbsqlite.c 
[root@localhost
temp]# 
得视输出文件
db.out ,其大小为: 12716k,比才的静态编译要稍得差不多。 
故而我们引进使用动态编译的法子。 
好了,现在我们来指定系统环境变量
LD_LIBRARY_PATH 的值 
在shell下输入: 

[root@localhost
temp]# export
LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH 

再运行 

[root@localhost
temp]# ./db.out 
You have
opened a sqlite3 database named zieckey.db successfully! 
Congratulations!
Have fun ! ^-^ 

凡是无是蛮有成就感阿
,呵呵,这一个上手仍旧高效的。 

3.
插入:insert 

恰巧大家通晓了怎么调用
sqlite3
的C/C++的API函数接口,上边我们看看怎么在C语言着为数据库插入数据。 

好的,大家临时编辑一段落c代码,取名为
insert.c 

// name:
insert.c 
// This prog
is used to test C/C++ API for sqlite3 .It is very simple,ha ! 
// Author :
zieckey All rights reserved. 
// data :
2006/11/18 

#include
<stdio.h> 
#include
<stdlib.h> 
#include
“sqlite3.h” 
#define
_DEBUG_ 

int main(
void ) 

sqlite3
*db=NULL; 
char
*zErrMsg = 0; 
int rc; 

rc =
sqlite3_open(“zieckey.db”, &db);
//打开指定的数据库文件,假诺无设有将创一个同名的数据库文件 
if( rc ) 

fprintf(stderr,
“Can’t open database: %s\n”, sqlite3_errmsg(db)); 
sqlite3_close(db); 
exit(1); 

else
printf(“You have opened a sqlite3 database named zieckey.db
successfully!\nCongratulations! Have fun ! ^-^ \n”); 

//成立一个表达,假使该表存在,则未成立,并受出指示消息,存储于
zErrMsg 中 
char *sql =
” CREATE TABLE SensorData(ID INTEGER PRIMARY KEY,SensorID
INTEGER,SiteNum INTEGER,Time VARCHAR(12),SensorParameter REAL);” ; 
sqlite3_exec( db
, sql , 0 , 0 , &zErrMsg ); 

#ifdef
_DEBUG_ 
printf(“%s\n”,zErrMsg); 
#endif 

//插入数据 
sql =
“INSERT INTO \”SensorData\” VALUES( NULL , 1 , 1 , ‘200605011206’,
18.9 );” ; 
sqlite3_exec( db
, sql , 0 , 0 , &zErrMsg ); 

sql =
“INSERT INTO \”SensorData\” VALUES( NULL , 1 , 1 , ‘200605011306’,
16.4 );” ; 
sqlite3_exec( db
, sql , 0 , 0 , &zErrMsg ); 

sqlite3_close(db);
//关闭数据库 
return 0; 

好的,将上述代码写副一个文件,并以其命名为
insert.c 。 
解释: 

sqlite3_exec的函数原型表明如下: 
int
sqlite3_exec( 
sqlite3*,
/* An open database */ 
const char
*sql, /* SQL to be executed */ 
sqlite_callback,
/* Callback function */ 
void *, /*
1st argument to callback function */ 
char
**errmsg /* Error msg written here */ 
); 

编译: 
[root@localhost
temp]# gcc insert.c -lsqlite3 -L/usr/local/sqlite3/lib
-I/usr/local/sqlite3/include 
insert.c:28:21:
warning: multi-line string literals are deprecated 
[root@localhost
temp]# 
执行 
[root@localhost
temp]# ./a.out 
./a.out:
error while loading shared libraries: libsqlite3.so.0: cannot open
shared object file: No such file or directory 
[root@localhost
temp]# 
无异于的景色,如上文处理措施: 
[root@localhost
temp]# export
LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH 
[root@localhost
temp]# ./a.out 
You have
opened a sqlite3 database named zieckey.db successfully! 
Congratulations!
Have fun ! ^-^ 
(null) 
(null) 
(null) 
[root@localhost
temp]# 
运行成功了,好了,现在咱们来探望是不是插入了数据 
[root@localhost
temp]# /usr/local/sqlite3/bin/sqlite3 zieckey.db 
SQLite
version 3.3.8 
Enter
“.help” for instructions 
sqlite>
select * from SensorData; 
1|1|1|200605011206|18.9 
sqlite,2|1|1|200605011306|16.4 
sqlite> 

哈哈,已经插入进去了,不是啊? 
大简短是休? 

  1. 查询:
    SELETE 

哼了,大家了然了怎么调用
sqlite3 的C/C++的API函数接口去创制数据库、创设表格、并插入数据, 
下边我们看看怎么当c语言吃查询数据库中之数码。 

好之,我们现编辑一段c代码,取名为
query.c 

// name:
query.c 
// This prog
is used to test C/C++ API for sqlite3 .It is very simple,ha ! 
// Author :
zieckey All rights reserved. 
// data :
2006/11/18 

#include
<stdio.h> 
#include
<stdlib.h> 
#include
“sqlite3.h” 
#define
_DEBUG_ 

int main(
void ) 

sqlite3
*db=NULL; 
char
*zErrMsg = 0; 

int rc; 

rc =
sqlite3_open(“zieckey.db”, &db);
//打开指定的数据库文件,倘诺非存用创建一个同名的数据库文件 
if( rc ) 

fprintf(stderr,
“Can’t open database: %s\n”, sqlite3_errmsg(db)); 
sqlite3_close(db); 
exit(1); 

else
printf(“You have opened a sqlite3 database named zieckey.db
successfully!\nCongratulations! Have fun ! ^-^ \n”); 

//成立一个表,倘若该表存在,则无创建,并给来提醒音讯,存储于
zErrMsg 中 
char *sql =
” CREATE TABLE SensorData( ID INTEGER PRIMARY KEY, SensorID INTEGER,
SiteNum INTEGER, Time VARCHAR(12), SensorParameter REAL );” ; 
sqlite3_exec( db
, sql , 0 , 0 , &zErrMsg ); 

#ifdef
_DEBUG_ 
printf(“zErrMsg =
%s \n”, zErrMsg); 
#endif 

//插入数据 
sql =
“INSERT INTO \”SensorData\” VALUES(NULL , 1 , 1 , ‘200605011206’, 18.9
);” ; 
sqlite3_exec( db
, sql , 0 , 0 , &zErrMsg ); 

sql =
“INSERT INTO \”SensorData\” VALUES(NULL , 1 , 1 , ‘200605011306’, 16.4
);” ; 
sqlite3_exec( db
, sql , 0 , 0 , &zErrMsg ); 

int nrow =
0, ncolumn = 0; 
char
**azResult; //二维数组存放结果 

//查询数据 
/* 
int
sqlite3_get_table(sqlite3*, const char *sql,char***result , int
*nrow , int *ncolumn ,char **errmsg ); 
result中凡因数组的形式存放你所查询的多寡,首先是表名,再是数额。 
nrow
,ncolumn分别吗查询语词重回的结果集的行数,列数,没有查到结果平日重回回0 
*/ 

网站地图xml地图