C/C++中Sqlite使用简介
来源:互联网 发布:高登世德数据分析招聘 编辑:程序博客网 时间:2024/09/21 08:15
form:http://blog.csdn.net/yousheng324/article/details/7455112
一、简介
SQLite是一个基于文件的轻量级数据库,但功能还挺强,速度也很快,对于小型数据库应用开发绝对够用了。使用起来也非常方便,下面的介绍可以看出来,使用起来真的非常简单。
二、官方网站
Sqlite的官方网站http://www.cnblogs.com/acloud/admin/www.sqlite.org,在该网站可以下载最新的sqlite版本。
三、辅助工具工具
Sqlite数据库的管理工具有SQLiteManager、SqliteAdmin等。
SqliteManager只有英文版,但功能强大,有个问题就是不支持ANSI字符集的汉字显示。其自带的帮助文档有SQL语句的详细介绍,对于不熟悉Sql语句的人来说很方便。而且它的很多操作都有自动的SQL语句提示,对于不常使用数据库的人来说也很好用。
SqliteAdmin有绿色中文版,功能相对于SqliteManager略少,对于熟悉Sql语句的人,该版本够用了。
四、C/C++使用前准备
直接将sqlite3.h和sqlite3.c加入自己的C/C++工程中,即可使用sqlite3。
Sqlite支持UTF-8和UTF-16,不过它居然不支持C/C++程序中最常用的ANSI。因此数据库路径中如果包含中文字符的话,需要将路径转换成相应的字符格式。
1、以UTF-8方式打开
//打开数据库
sqlite3 *db = NULL;
int result = sqlite3_open("c:\\abc.db", &db);
if (SQLITE_OK != result)
{
return;
}
//关闭数据库
sqlite3_close(db);
2、以UTF-16方式打开
如要以UTF-16方式打开,把打开数据库的语句改为"sqlite3_open16(L"c:\\abc.db", &db)"即可。
但一般情况,强烈不建议使用UTF-16方式打开数据库,根据我的测试,我发现如果以这种方式打开数据库,在后续创建数据表的时候,如果其中有某项为TEXT类型。那么数据表的这项数据内容,将会强制确定类型为UTF-16。也就是说,你插入的任何数据,都将被转换为UTF-16并存入数据库。而执行SQL的语句是UTF-8格式的,因此当你取出的数据和你存入的数据是不一致的,很显然这对于使用者而言是一个灾难。
执行SQL语句可以调用sqlite3_exec函数,一般来说,如果不需要返回的数据和错误信息,执行方式如下:
sqlite3_exec(db, strSQL, 0, 0, 0);
假设创建如下图所示的数据库:
其SQL语句为:
CREATE TABLE [MyTable] ([ID] INTEGER PRIMARY KEY NOT NULL,[MyText] TEXT NULL, [MyDate]DATE NOT NULL, [MyTime] TIME NULL,[MyFloat] FLOAT NULL)
下面是插入一条记录的示例SQL语句。
INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('---上班好远!', '2012-03-23', '9:00:00', 1000)
下面是更新若干条记录的示例SQL语句。
UPDATE MyTable SET MyText='真的吗?', MyTime='10:00:00' WHERE ID >=0 AND ID <=20
下面是删除若干条记录的示例SQL语句。
DELETE FROM MyTable WHERE ID >=3 AND ID <=5
如果要进行大量的操作,比如要插入10000条数据,如果逐条执行SQL语句,则消耗的时间非常长。采用事务的方式批量处理,可以极大程度提升操作速度(我用1000条记录实验了一下,速度提高了500倍以上)。
下面是一个批量插入10000条数据的代码示例:
//插入条数据(在Begin和Commit之间批量操作,可以大幅度提高效率)
result = sqlite3_exec(db, "BEGIN;", 0, 0, 0);
for (int i=0; i<10000; i++)
{
//插入一条数据
result = sqlite3_exec(db,
"INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('---上班好远!', '2012-03-23', '9:00:00', 1000);",
0, 0, 0);
}
result = sqlite3_exec(db, "COMMIT;", 0, 0, 0);
下面是以表单形式获取数据的示例代码:
//查询记录(返回数据表的方式)
char **pazResult;
int nRow, nCol;
sqlite3_get_table(db, "SELECT * FROM MyTable LIMIT 1000 OFFSET 2000", &pazResult, &nRow, &nCol, 0);
//nRow指示出有多少行
//nCol指示出有多少列
//从pazResult中可以解析出所有记录,记录以字符串形式返回
//第n列的名称,存放于pazResult[n]
//第n行第m列的数据,存放与paszResult[(m + 1) * nCol + m]
//使用完后,务必释放为记录分配的内存
sqlite3_free_table(pazResult);
上面的查询代码,也演示了如何查询指定位置指定条数的记录,这种查询方法在记录集非常庞大的时候很有用。
下面以代码形式示例如何获得查询语句返回的记录。
首先需要定义一个回调函数如下(参数意义待会再说):
int Result(void* pContext, int nCol, char** azValue, char**azName);
然后调用sqlite函数执行查询语句,在回调函数一栏输入上面定义的回调函数:
sqlite3_exec(db, "SELECT * FROM MyTable LIMIT 10 OFFSET 20",Result, 0, 0);
执行该SQL语句时,每返回一条记录都会触发一次上面的回调函数,在该回调函数的实现中,即可得到查询结果。
在上面的Result函数中,各个参数意义如下:
pContext
这个参数是调用sqlite3_exec函数是输入的第4个参数。它通常作为环境变量用于指示出当前执行代码的主体。示例代码中我忽略了这个参数,但正式使用时一般不会忽略它。
nCol
表示该条记录有多少列。
azValue
返回的数据都蕴含在该变量中,它也是一个字符串数组。azValue[n]即为第n列的数据。
azName
存放列的名称,azName[n]就是第n列的名称。
存取二进制数据需要用到sqlite3_bind_blob等函数,具体用法可以查看这些函数的声明。作为一个轻量级数据库,我一般不用它存储二进制数据,因此这儿不再详细描述这些内容。
- C/C++中Sqlite使用简介
- C/C++中Sqlite使用简介
- C/C++中Sqlite使用简介
- C/C++中Sqlite使用简介
- C/C++中Sqlite使用简介
- C/C++中Sqlite使用简介
- sqlite API 简介(C\C++)
- sqlite c库使用
- Linux C 中断言assert()使用简介
- Linux C 中断言assert()使用简介
- SQLite学习手册(C/C++接口简介)
- SQLite学习手册(C/C++接口简介)
- SQLite学习手册(C/C++接口简介)
- SQLite学习手册(C/C++接口简介)
- SQLite学习手册(C/C++接口简介)
- 学习使用SQLite(版本3.7.4)(中C)
- vs中使用c#\sqlite数据库开发(1)
- iOS-SQLite在项目中实际使用(Objective-C)
- sqlite3导库方法与wxsqlite3不能读取中文的问题解决
- oracle表空间详解--原理 .
- ComboBox 控件 SelectedText (显示) 和 SelectedValue (值) 区别
- U盘设置
- 不能将参数 1 从“int”转换为“std::_Vector_const_iterator<_Myvec>”(VS2010 )
- C/C++中Sqlite使用简介
- Linux 下网络性能优化方法简析
- VS2008 打开"视图设计器" 和 "查看代码"提示没有可用的编辑器问题
- HTTP协议分析
- 数据迁移存储过程 .
- 多态的实现(重载、虚函数、抽象类)
- C++对象模型学习笔记(二)--默认构造函数
- iOS开源类库收集
- dos启动盘访问硬盘