加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite3 数据库使用

发布时间:2020-12-12 23:59:31 所属栏目:百科 来源:网络整理
导读:一、SQLite简介 SQLite 是用C语言编写的开源数据库,主要用于嵌入式,你也可以把它集成在自己的桌面程序中,也有人将其替代Access,用作后台数据库。 SQLite 支持多数SQL92标准,例如:索引、限制、触发和查看支持。 支持 NULL、INTEGER、REAL、TEXT 和 BLOB

一、SQLite简介

SQLite 是用C语言编写的开源数据库,主要用于嵌入式,你也可以把它集成在自己的桌面程序中,也有人将其替代Access,用作后台数据库。

SQLite 支持多数SQL92标准,例如:索引、限制、触发和查看支持。

支持 NULL、INTEGER、REAL、TEXT 和 BLOB 数据类型,支持事务。

二、下载SQLite

SQLite可以到官方站点下载

http://www.sqlite.org/download.html

包括:Linux,Mac OS X,Windows下的已编译文件以及源代码、帮助文档。

SQLite浏览工具下载:http://sqliteadmin.orbmu2k.de/

三、SQLite使用

1、 数据库连接、SQL解析接口:

sqlite3_open(); //以UTF-8方式打开


sqlite3_prepare()
sqlite3_step()


sqlite3_column()


sqlite3_finalize()


sqlite3_close()

2、sqlite3_column()

sqlite3_column_blob()
sqlite3_column_bytes()
sqlite3_column_bytes16()
sqlite3_column_count()
sqlite3_column_double()
sqlite3_column_int()
sqlite3_column_int64()
sqlite3_column_text()
sqlite3_column_text16()
sqlite3_column_type()
sqlite3_column_value()

3、SQL

sqlite> create table 数据库 (名字,嵌入式);
sqlite> insert into 数据库 values ('SQLite','是');
ssqlite> select * from 数据库;
sqlite> update 数据库 set 名字='SQLite3' where 名字='SQLite';
sqlite> delete from 数据库 where 嵌入式='是';
sqlite> .separator "-"

4、事务

result = sqlite3_exec(db,"BEGIN;",0);

//批量处理
for (int i=0; i<10000; i++)
{
//插入一条数据
result = sqlite3_exec(db,
"INSERT INTO MyTable (MyText,MyDate,MyTime,MyFloat) VALUES ('SQLITE3!','2013-07-28','23:00:00',1000);",0);
}

result = sqlite3_exec(db,"COMMIT;",0);

5、触发器

假设"customers"表存储了客户信息,"orders"表存储了订单信息,下面的触发器 确保当用户 改变地址时所有的 关联订单地址均进行相应改变:

CREATE TRIGGER update_customer_address UPDATE OF address ON customers
BEGIN
UPDATE orders SET address = new.address WHERE customer_name = old.name;
END;

定义了该触发器后执行如下语句:

UPDATE customers SET address = '1 Main St.' WHERE name = 'Jack Jones';

会使下面的语句自动执行:

UPDATE orders SET address = '1 Main St.' WHERE customer_name = 'Jack Jones';

注意,目前在有INTEGER PRIMARY KEY域的表上触发器可能工作不正常。若 BEFORE触发器修改 了一行的 INTEGER PRIMARY KEY域,而该域将由触发该触发器 的语句进行修改,则可能根本不 会修改该域。 可以用PRIMARY KEY字段代替 INTEGER PRIMARY KEY字段来解决上述问题。

6、SQL执行 回调 与 不回调

回调方案
int sqlite3_exec ( sqlite3 *db,// 使用 sqlite3_open () 打开的数据库对象。
const char *sql,// 一条待查询的 SQL 语句
sqlite3_callback,// 自定义的回调函数,对查询结果每一行都执行一次这个函数
void *,
char **errmsg
);

这是最常用的执行 sql 语句的调用。简单的参数含意标在上面函数中,下面对重
要参数含意详细注释:

- 第 4 个参数 "void *" 是调用者所提供的指针,可以传递任何一个指针参数到
这里,这个参数最终会传到回调函数里面,这个指针比较重要,可以用来作参
数的传递。如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调
函数的写法,以及这个参数的使用。

- 第 5 个参数 "char ** errmsg" 是错误信息。注意是指针的指针。sqlite3里
面有很多固定的错误信息。执行 sqlite3_exec 之后,执行失败时可以查阅这
个指针(直接 printf(“%sn”,errmsg))得到一串字符串信息,这串信息告诉
你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供
的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个
char*得到具体错误提示。

说明:通常, sqlite3_callback 和它后面的 void * 这两个位置都可以填
NULL。填NULL表示你不需要回调。比如你做 insert 操作,做 delete 操作,就
没有必要使用回调。而当你做 select 时,就要使用回调,因为 sqlite3 把数据
查出来,得通过回调告诉你查出了什么数据。

** exec 的回调函数

typedef int(*sqlite3_callback) (void *,// 这就是上面函数传递的 void * 参数,需要强制类型转换后才能使用。
int,// 查询结果的列数,即有多少个字段数
char **,// 保存查询结果
char ** // 各个字段的名字
);

不回调方案 int main( int,char ** ) { sqlite3 * db; int result; char * errmsg = NULL; char ** dbResult; //是 char ** 类型,两个*号 int nRow,nColumn; int i,j; int index; result = sqlite3_open( “c:database.db”,&db ); if( result != SQLITE_OK ) { //数据库打开失败 return -1; } //数据库操作代码 //假设前面已经创建了 MyTable_1 表 //开始查询,传入的 dbResult 已经是 char **,这里又加了一个 & 取地址符,传递进去的就成了 char *** result = sqlite3_get_table( db,“select * from MyTable_1”,&dbResult,&nRow,&nColumn,&errmsg ); if( SQLITE_OK == result ) { //查询成功 index = nColumn; //前面说过 dbResult 前面第一行数据是字段名称,从 nColumn 索引开始才是真正的数据 printf( “查到%d条记录n”,nRow ); for( i = 0; i < nRow ; i++ ) { printf( “第 %d 条记录n”,i+1 ); for( j = 0 ; j < nColumn; j++ ) { printf( “字段名:%s ?> 字段值:%sn”,dbResult[j],dbResult [index] ); ++index; // dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始,后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示 } printf( “-------n” ); } } //到这里,不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放 sqlite3_free_table( dbResult ); //关闭数据库 sqlite3_close( db ); return 0; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读