下载 sqlite-3.3.6.tar.gz
解压并拷贝至你想要安装到的目录下,我选择的是/usr/local/sqlite-3.3.6
接着在终端里:
# cd /usr/local/sqlite-3.3.6
# ./configure
# make
# make install
# make doc
make 的时候提示错误
../sqlite-3.3.6/src/tclsqlite.c: In function `DbUpdateHandler':
../sqlite-3.3.6/src/tclsqlite.c:333: warning: passing arg 3 of `Tcl_ListObjAppendElement' makes pointer from integer without a cast
……
这个都是tcl 相关的错误, 可以先安装ActiveTcl 以解决. 假如你不需要tcl 支持, 那么这个错误可以这样避免:
# ./configure --disable-tcl --prefix=/usr/local/sqlite-3.3.6
# make 如果提示没有可以编译的文件,则是第一次make 时已经执行过了,接着下面做就可以了;如果此次是第一次编译,应该不会再提示出错了
# make install
# make doc
测试是否安装成功
# cd /usr/lcoal/sqlite-3.3.6
# ./sqlite3 text.db // 这也是进入数据库的方法
如果安装成功,会出现下面这样的信息
SQLite version 3.3.6
Enter ".help" for instructions
sqlite>
接下来就可以自由操作啦,和在windows 下是一样的啦。
二、 SQLite 基本操作
如以下操作:创建表、插入、查询:
sqlite> create table tbl1(one varchar(10), two smallint);
sqlite> insert into tbl1 values('hello!',10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>
注意每句SQL 语句后一定要有分号 semicolon 。
Special commands to sqlite3 :
sqlite> .help
.databases List names and files of attached databases
.exit Exit this program
.output FILENAME Send output to FILENAME
.output stdout Send output to the screen
.tables List the tables
参考文件:A command-line access program for sqlite databases//www.sqlite.org
三、C/C++ 下SQLite 编程
参考文件:A introduction to the sqlite c/c++ interface
找到安装SQLite 的路径:
我们的 sqlite3 的库文件目录是: /usr/local/sqlite3/lib // 我的机子安装目录文件名是 sqlite-3.3.6
可执行文件 sqlite3 的目录是: /usr/local/sqlite3/bin
头文件 sqlite3.h 的目录是: /usr/local/sqlite3/include
编译指南 : 现在编译: [root@localhost dada]# gcc c3.c -o c3
opendbsqlite.c:11:21: sqlite3.h: 没有那个文件或目录
opendbsqlite.c: In function `main':
opendbsqlite.c:19: `sqlite3' undeclared (first use in this function) // 这是由于没有找到头文件的原因 。
/tmp/ccTkItnN.o(.text+0x2b): In function `main':
: undefined reference to `sqlite3_open'
/tmp/ccTkItnN.o(.text+0x45): In function `main': // 这是个没有找到库文件的问题。
可以在 gcc 语句后面加上如下
-lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include
指明用到的库文件;为库文件指定路径;为头文件指定路径
继续编译 :
出现 " error while loading shared libraries " 等错误
我们可以这样解决:
方法一:静态编译
在编译时加上 -static 参数,例如
[root@localhost temp]# gcc c3.c -o c3 -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include –static
静态编译后的文件相对动态编译更大,很容易理解,静态编译把头库文件作为程序的一部分都包含进来了。
方法二:重新配置系统环境变量 LD_LIBRARY_PATH
这时需要指定 libsqlite3.so.0 库文件的路径 , 也就是配置系统环境变量 LD_LIBRARY_PATH ,
使系统能够找到 libsqlite3.so.0 。
好了,现在我们来指定系统环境变量 LD_LIBRARY_PATH 的值
在 shell 下输入:
[root@localhost temp]# export LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH
看看现在系统环境设置:
[root@localhost temp]#env
….
LD_LIBRARY_PATH=/usr/local/sqlite3/lib:
….. ( 看到了吧, LD_LIBRARY_PATH 这一行开始就是 sqlite3 的库文件路径: )
去掉 -static , 再编译:
[root@localhost temp]# gcc c3.c -o c3 -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include
我们推荐使用动态编译的方法。
至此编译就不会有什么问题了,另外一点:如果在程序中把# include <sqlite3.h> 写成# include<usr/local/sqlite-3.3.6/include/sqlite3.h>, 这样在编译的时候就不需要 -I/usr/local/sqlite3/include 了。
常用函数
int sqlite3_open(
const char *filename,
/* Database filename (UTF-8) */
sqlite3 **ppDb
/* OUT: SQLite db handle */
);
int sqlite3_close(sqlite3 *);
int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg );
这就是执行一条 sql 语句的函数。
第 1 个参数不再说了,是前面 open 函数得到的指针。说了是关键数据结构。
第 2 个参数 const char *sql 是一条 sql 语句,以 /0 结尾。
第 3 个参数 sqlite3_callback 是回调,当这条语句执行之后, sqlite3 会去调用你提供的这个函数。
第 4 个参数 void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,这个指针比较重要,可以用来作参数的传递。如果不需要传递指针给回调函数,可以填 NULL 。等下我们再看回调函数的写法,以及这个参数的使用。
第 5 个参数 char ** errmsg 是错误信息。注意是指针的指针。 sqlite3 里面有很多固定的错误信息。执行 sqlite3_exec 之后,执行失败时可以查阅这个指针(直接 printf(“%s/n”,errmsg) )得到一串字符串信息,这串信息告诉你错在什么地方。 sqlite3_exec 函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样 sqlite3_exec 函数外面就可以通过这个 char* 得到具体错误提示。
说明:通常, sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL 。填 NULL 表示你不需要回调。比如你做 insert 操作,做 delete 操作,就没有必要使用回调。而当你做 select 时,就要使用回调,因为 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。用 select 时也可以用 sqlite3_get_table
查询:
int sqlite3_get_table(
sqlite3 *db,
/* An open database */
const char *zSql,
/* SQL to be evaluated */
char ***pazResult,
/* Results of the query */
int *pnRow,
/* Number of result rows written here */
int *pnColumn,
/* Number of result columns written here */
char **pzErrmsg
/* Error msg written here */
);
void sqlite3_free_table(char **result);
//
释放内存空间
例子程序:
#include <stdio.h>
#include </usr/local/sqlite-3.3.6/include/sqlite3.h>
int main(void){
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("text.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 text.db sucessfully!");
char *sql="create table student(id integer,name varchar(10));"; // 创建表
sqlite3_exec(db,sql,0,0,&zErrMsg);
sql="insert into/"student/" values(23 ,'Lebron');"; 插入记录
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
*/
sql = "SELECT * FROM student ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
int i = 0 ;
printf( "row:%d column=%d /n" , nrow , ncolumn );
printf( "/nThe result of querying is : /n" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s/n", i , azResult[i] );
sql = "DELETE FROM student WHERE ID = 1 ;" ; // 删除记录
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
// 释放掉 azResult 的内存空间
sqlite3_free_table( azResult );
sqlite3_close(db); // 关闭数据库
return 0;
}
< 上述代码可以在本机 /root/dada/c3.c 中找到 .>
两点说明:
1 程序会在开头定义 #define _DEBUG_
#ifdef _DEBUG_
printf("zErrMsg = %s /n", zErrMsg);
#endif
如果调试的话,即有 #define _DEBUG_ 就会输出调试的错误信息,否则如果注释掉 #define _DEBUG 就不执行这段代码。
2 rc = sqlite3_open("text.db", &db); 如果 text.db 不存在的话,则是会在 c3 文件同目录下自动生成这样一个同名的数据库。
如何执行一个.db 文件 (通常这个文件不在安装 sqlite 的目录路径下):
# /usr/local/sqlite-3.3.6/bin/sqlite3 text.db //( /usr/local/sqlite-3.3.6/bin/sqlite3 即是程序 )
若出现错误 error:while loading shared libraries 则需要先执行 ---
export LD_LIBRARY_PATH=/usr/local/sqlite-3.3.6/lib:$LD_LIBRARY_PATH
然后就可以进入数据库了: sqlite>