Chinaunix首页 | 论坛 | 博客
  • 博客访问: 999943
  • 博文数量: 633
  • 博客积分: 30780
  • 博客等级: 大将
  • 技术积分: 7532
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-12 21:07
文章分类

全部博文(633)

文章存档

2011年(10)

2010年(500)

2009年(47)

2008年(76)

我的朋友

分类:

2008-05-11 22:33:25

第一章 从这里开始
1.0 引言
    最近发现网上很多人在文 sqlite 数据库的问题,可是解答的人并不多。于是萌生了写点这方面的文章的念头。虽然我也是刚接触 sqlite 不到半年,对其了解得也不是很深很透彻,但是写点东西让初学者能够很快上手,也算是我的心愿之一。也许很多高手会觉得我这是班门弄斧,但是我还是想写点关于 sqlite 的基本知识,这样也许能给予某些人一些帮助,希望如此。
    
下文介绍的内容都是基于 Linux RedHat 9.0 平台的。
                   
1.1 sqlite简介
    sqlite是嵌入式SQL数据库引擎SQLite(SQLite Embeddable SQL Database Engine)的一个扩展。SQLite是一个实现嵌入式SQL数据库引擎小型C语言库(C library),实现了独立的,可嵌入的,零配置的SQL数据库引擎。特性包括:事务操作是原子,一致,孤立,并且持久的,即使在系统崩溃和电源故障之后。 零配置——不需要安装和管理。 实现了绝大多数SQL92标准。整个数据库存储在一个单一的文件中。数据库文件可以在不同字节序的机器之间自由地共享。支持最大可达2T的数据库。字符串和BLOB类型的大小只受限于可用内存。完整配置的少于250KB,忽略一些可选特性的少于150KB。在大多数常见操作上比流行的客户/服务器数据库引擎更快。 简单易于使用的API。 内建TCL绑定。 另外提供可用于许多其他语言的绑定。具有良好注释的源代码,代码95%有较好的注释。 独立:没有外部依赖。 源代码位于公共域,可用于任何用途。用SQLite连接的程序可以使用SQL数据库,但不需要运行一个单独的关系型数据库管理系统进程(separate RDBMS process)。SQLite不是一个用于连接到大型数据库服务器(big database server)的客户端库(client library),而是非常适合桌面程序和小型网站的数据库服务器。SQLite直接读写(reads and writes directly)在硬盘上的数据库文件。
    这一章告诉你怎么开始体验 SQLite ,这里没有长长的说明和冗烦的配置。

1.2 下载代码
    取得一份二进制拷贝, 或者是源代码并自己编译它。关于这个可以到 的下载页面获得更多信。
这里我就不多说了。
    
1.3 安装
    请阅读在安装包里的 INSTALL 文件。或者使用PEAR installer with "pear install sqlite"。SQLite已经内置了,你不需要安装任何附加的软件(additional software)。
Windows users可以下载SQLite扩展DLL(php_sqlite.dl)。
这里简单介绍一下:
假设你得到的是源代码,这里将告诉你怎么编译它。
解压sqlite-3.0.8.tar.gz 到 /home目录下
       For example:
    
    # tar xzf sqlite.tar.gz –C /home/       ;#  Unpack the source tree into "sqlite"
    # mkdir sqlite-pc                      ;#  Build will occur in a sibling directory
    # cd sqlite-pc                                ;#  Change to the build directory
    # ../sqlite/configure                      ;#  Run the configure script
    #  make                                 ;#  Run the makefile.
    #  make install
生成帮助文档
    #  make doc
    
如果一切顺利的话,sqlite的库文件将会生成在 /usr/local/lib 目录下。去看看有没有这些库文件。
libsqlite3.a  libsqlite3.la  libsqlite3.so  libsqlite3.so.0  libsqlite3.so.0.8.6  pkgconfig
好了我们可以进入下一节了。激动人心的时刻到了,我们可以轻而易举的创建和操纵数据库了。

1.4 创建一个新数据库
在 shell 命令行下, 输入: "sqlite3 zieckey.db"。 将创建一个新的数据库文件名叫"zieckey.db". (当然你可以使用不同的名字)
输入 SQL 命令在提示符下创建和写入新的数据。
例如,新建一个名为zieckey.db的数据库,并创建一个名为 SensorData 的表,其包含两个列元素,并插入具体列元素,具体如下
    # sqlite3 zieckey.db
    SQLite version 3.0.8
    Enter ".help" for instructions
    sqlite> create table SensorData(one varchar(10), two smallint);
    sqlite> insert into SensorData values('hello!',10);
    sqlite> insert into SensorData values('goodbye', 20);
    sqlite> select * from SensorData;
    hello!|10
    goodbye|20
    sqlite>
安全退出 sqlite 的方法是
    sqlite> .quit
这样刚才的操作就保存下来了,如果强行退出有可能丢失刚才对数据库的操作。
是不是相当容易,呵呵,当然拉!如果你会 SQL 语言,你会发现,sqlite的语法几乎和它一个样。
这里先到这里,后面的章节中我们会继续学习sqlite的语法规则的。
 1.5 写个C语言程序调用SQLite
    现在我们来写个C/C++程序,调用 sqlite    的 API 接口函数。
    下面是一个C程序的例子,显示怎么使用 sqlite 的 C/C++ 接口. 这个函数调用sqlite3_open() 在 22 行打开数据库, sqlite3_exec() 在 27 行执行 SQL 命令, 并且sqlite3_close() 在 31 行关闭数据库连接。
代码:

//     name: opendbsqlite.c
//    This file is used to test C/C++ API for sqlite
//     Author : zieckey
//     2006/04/11
#include
#include
 
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("open zieckey.db successfully!\n");
    
    sqlite3_close(db);               //关闭数据库
    return 0;
}

编译:# 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

这是个没有找到库文件的问题。
由于用到了用户自己的库文件,所用应该指明所用到的库,我们可以这样编译:

# gcc opendbsqlite.c -o db.out -lsqlite3

我用用 -lsqlite3 选项就可以了(前面我们生成的库文件是 libsqlite3.so.0.8.6 等,
去掉前面的lib和后面的版本标志,就剩下 sqlite3 了所以是 -lsqlite3 )。
如果我们在编译安装的时候,选择了安装路径,例如这样的话:
.......
# ../sqlite/configure --prefix=/usr/local/arm-linux/sqlite-ix86-linux
.......
这样编译安装时,sqlite的库文件将会生成在  /usr/local/arm-linux/sqlite-ix86-linux/lib 目录下
这时编译还要指定库文件路径,因为系统默认的路径没有包含 /usr/local/arm-linux/sqlite-ix86-linux/lib

# gcc opendbsqlite.c -lsqlite3 -L/usr/local/arm-linux/sqlite-ix86-linux/lib

如果还不行的话,可能还需要指定头文件 sqlite3.h 的路径,如下:

# gcc opendbsqlite.c -lsqlite3 -L/usr/local/arm-linux/sqlite-ix86-linux/lib -I/usr/local/arm-linux/sqlite-ix86-linux/include

这样编译应该就可以了 ,运行:
# ./db.out
./db.out: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory
运行是也许会出现类似上面的错误。
这个问题是由于运行沿着系统默认路径没有找到库文件引起的。这时需要指定 libsqlite3.so.0 库文件的路径。
在shell下输入:
export LD_LIBRARY_PATH=/usr/local/arm-linux/sqlite-ix86-linux/lib:$LD_LIBRARY_PATH
再运行
# ./db.out
open zieckey.db successfully!
是不是很有成就感阿 ,呵呵,这个上手还是很快的。


总结:这一章里,我们了解了sqlite的基本概貌,并且知道了怎么创建数据库,
怎么向数据库中插入表格,向表格中插入数据,更令人兴奋的是我们知道了
怎么在C/C++中调用 sqlite 的 API 函数。
写后感:这是我第一次这样用心的比较正规的写关于一个专题的文章。
我也是望着篇文章能带给你帮助。如果是这样的话,那我的努力就没有白费,这让我觉得我还做了点好事的。
本文一定存在很多不妥或者错误之处,还劳烦各位不吝赐教指正。在此跟贴,或者发 email :zieckey@yahoo.com.cn  ,本人将不胜感激。
作者郑重申明:本文可以自由转载,但请不要去掉版权信息,也不要用于商业用途。
阅读(522) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~