设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 5479|回复: 5
打印 上一主题 下一主题

[ADO/DAO] sqlite内存数据库的使用以及内存数据库导入导出

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2015-5-18 12:00:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘自peter的文章,Sqlite内存数据库因为速度快,操作方便而让sqlite在一些企业应用场景非常有用,如经常使用的产品信息 BOM信息等。如果每次都从数据库服务器读取加载,速度会比较慢。这时内存数据库就非常有用了。

一、初识sqlite
         偶然的机会接触到sqlite,不禁惊叹sqlite的体型小巧而功能强大(看来软件也不可貌相哦),Sqlite 是开源的内存数据库(也可以称之为内嵌式数据库),大量无私的程序员为sqlite发展贡献了自己的力量。Sqlite 应用极广,手机、mp3,机顶盒可能存在sqlite身影,Apple的Mac os,linux,或者windows在安装第三方软件时也可以应用sqlite。
         Sqlite技术优点:
1.  Sqlite轻量级、跨平台的关系型开源内存数据库,使用sqlite只需带上动态库,就可使用sqlite全部功能(动态库Windows下487KB,Linux下347KB);
2.   核心引擎不依赖第三方软件,也不需要安装;
3.   数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。这个文件可以copy到其它目录或其它机器上,也照用不误。如果使用内存方式,可以没有该文件;
4.   除了主流操作系统,SQLite还支持了很多冷门的操作系统。它对很多嵌入式系统(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)也支持;
5.   SQLite的API不区分当前操作的数据库是在内存还是在文件(对于存储介质是透明的);
等等;
         缺点:
1.    并发访问的锁机制
SQLite在并发(包括多进程和多线程)读写方面的性能不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错;
2.     SQL标准支持不全
如不支持外键约束;
          看来还是优点多于缺点!呵呵!
二、sqlite体系机构
               sqlite模块将 查询过程分为几个不连续的任务,在结构栈的顶部编译查询语句,中不执行,在底部处理操作系统的存储和接口。
." action-data="http%3A%2F%2Fhi.csdn.net%2Fattachment%2F201109%2F8%2F0_1315465068M797.gif" action-type="show-slide" style="border: 0px; list-style: none;">
                                                            图1-2SQLite的体系结构
(注:结构图转载于《SQLite权威指南》)
三、sqlite文件数据库、内存数据库建立及导入导出
           sqlite官网(www.sqlite.org)同时提供已编译版本和源程序。同时适用于Windows和linux。
           经过前面sqlite热身之后,赶紧转入正题,干点正事!(*^__^*)
3.1 文件数据库、内存数据库的建立3.1.1文件数据库的建立
Windows:
1)  下载sqlite最新版本sqlite3.exe;
2)  dos进入到执行程序目录下;
3)  输入 sqlite3  d:\test.db(如果后面执行路径存在test.db 则打开数据库;如果执行路径下不存在test.db则新建test.db);
Linux:
1)  下载sqlite最新版本sqlite3;
2)  Shell进入到可知性程序目录下;
3) 输入sqlite3  /home/test.db(如果后面执行路径存在test.db 则打开数据库;如果执行路径下不存在test.db则新建test.db);
至此则打开或者新建一个文件数据库库;
3.1.2 内存数据库的建立
[cpp]  
  • C代码示例:
  • sqlite3 *db;
  • rc = sqlite3_open(":memory:",&db);    // 内存中创建一个数据库
  • 3.2 文件数据库、内存数据库的导入导出
  • C代码示例:
  • ////////////////////////////////////////////////////////////////////////////////////////////
  • //参数说明:
  • //pInMemory: 指向内存数据库指针
  • //zFilename: 指向文件数据库目录的字符串指针
  • //isSave  0: 从文件数据库载入到内存数据库 1:从内存数据库备份到文件数据库
  • ////////////////////////////////////////////////////////////////////////////////////////////
  • int loadOrSaveDb(sqlite3 *pInMemeory, const char *zFilename, int isSave)
  • {
  •          int rc;
  •          sqlite3 *pFile;
  •          sqlite3_backup *pBackup;
  •          sqlite3 *pTo;
  •          sqlite3 *pFrom;
  •          rc = sqlite3_open(zFilename, &pFile);
  •          if(rc == SQLITE_OK)
  •          {
  •                    pFrom = (isSave?pInMemeory:pFile);
  •                    pTo = (isSave?pFile:pInMemeory);
  •                    pBackup = sqlite3_backup_init(pTo,"main",pFrom,"main");
  •                    if(pBackup)
  •                    {
  •                             (void)sqlite3_backup_step(pBackup,-1);
  •                             (void)sqlite3_backup_finish(pBackup);
  •                    }
  •                    rc = sqlite3_errcode(pTo);
  •          }
  •          (void)sqlite3_close(pFile);
  •          return rc;
  • }


调用实例:
[cpp]  
  • int ret = 0;
  • char *filename = “d:\\test.db”;
  • sqlite3 *memoryDb;
  • ret = sqlite3_open(“memory:”, &memoryDb);
  • ret = loadOrSaveDb(memoryDb, filename, 0) //文件数据库导入到内存数据库


3.3 文件数据库命令格式的导入导出
         3.3.1 文件数据库命令格式数据导出、备份
方法一:(sqlite数据库内部)
Sqlite>.output d:\test.sql

相关文章:

sqlite建立内存数据库方法为打开数据库是数据库名称用 :memory: 。

下面为如何将文件数据库附加到内存数据库中

如果你使用内存数据库

我猜想,SQLite会使用系统默认的编码。

所以,你如果你要把数据库附加到内存数据库时,则需要注意附加的文件编码也要使用系统默认的。

否则,你无法使用附加的数据。

关键点:编码问题。

还有一个问题,你的语法对了吗?

正确的语法:@"ATTACH 'd:\gldstest.db' as db333 key '123456'


以下是一个前辈在一篇文章《SQLite的加密扩展方法 》提到的三个方法:

在sqlite3sec中你可以使用下列三种方法来添加一个加密的数据库:

  sqlite> ATTACH 'b.db' AS b;

  sqlite> ATTACH 'b.db' AS b KEY 'your passphrase';

  sqlite> ATTACH 'b.db' AS b KEY blob;


第一种方法使用和主数据库相同的密码(或者是没有密码) , 第二种方法用你输入的短语来做密码. 第三种方法假设你用BLOB的十六进制值作为密码(例如 f03d69ac3981...). 不过我还没有充分的测试这个使用BLOB作为密码的版本. 请注意:如果你的主数据库是加密的,然后你想添加一个不加密的数据库,这种情况下你需要用第二种方法然后传递一个空字符串('')作为密码.


评分

参与人数 1经验 +1 收起 理由
风中漫步 + 1 谢谢分享

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2015-5-18 13:32:46 | 只看该作者
主要缺点还是不支持网络.仅支持一写多读.至于标准,很多公司都有自己的小准则,acc有的也不支持.
估计用惯ms产品的网友对他一定没好感{:soso_e100:}

点击这里给我发消息

3#
 楼主| 发表于 2015-5-18 13:44:11 | 只看该作者
主要缺点是 并发操作
4#
发表于 2015-5-18 14:11:26 | 只看该作者
呵呵,站长把它用在什么地方了?
单机不会有那些并发吧
请指教
5#
发表于 2015-5-18 15:58:34 | 只看该作者
额,我一直以为mongodb比较好呢{:soso_e120:}——不过那是NOSQL的,做网页前端也行用得上{:soso_e120:}
附上主流数据库排行榜
http://db-engines.com/en/ranking
6#
发表于 2015-5-18 17:33:40 | 只看该作者
roych 发表于 2015-5-18 15:58
额,我一直以为mongodb比较好呢——不过那是NOSQL的,做网页前端也行用得上
附 ...

听说mongodb也不错啊.只是许可不给力.
sqlite是真正的自由软件,袖珍,用在移动便携设备上很合适.传说最早是为美军导弹驱逐舰上设计的,设计初衷就是要简单小巧,差不多也做到了.
个人觉得它最大的优点是跨平台且袖珍.
功能也符合它的身段,够用.
看它的设计,当初作者可能也有其他打算.
谢谢斑竹的排行榜,长见识了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-5 02:38 , Processed in 0.085332 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表