一、SQLite在linux下的安装
下载 sqlite-3.3.6.tar.gz
|
二、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就不执行这段代码。
2rc = 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>