桌面轻量级数据库的选择:Access、SQLite、自己编写?
1. Access
我们做小项目的时候特别是小的MIS系统一般也都要用数据库来保存数据。经观察大部分的小系统都是用Access数据库,有的系统为了掩盖数据库的类型,把数据文件后缀名改了,其实只要改回到mdb,用Access打开,数据一目了然,其实Access数据库本身有很多的问题:性能不行;数据不安全,用户可以直接用Access打开数据库文件进行数据修改,即使加密后都可以直接破解;Access的数据量一大,文件本身的体积就异常庞大;Access数据库文件很容易损坏,我做的一个系统由于意外断电老是当掉,用户的数据几经摧毁。 为了弥补Access的缺陷,我曾经用MySQL数据库代替,但MySQL是网络数据库,安装起来比较复杂。后来在用Python做项目的时候发现了SQLite,真是相见恨晚,SQLite就是Access理想的替代品啊!
2. SQLite
SQLite是一个小型的C程序库,实现了独立的,可嵌入的,零配置的SQL数据库引擎。特性包括:
事务操作是原子,一致,孤立,并且持久的(ACID),即使在系统崩溃和电源故障之后。
零配置——不需要安装和管理。
实现了绝大多数SQL92标准。
整个数据库存储在一个单一的文件中。
数据库文件可以在不同字节序的机器之间自由地共享。
支持最大可达2T的数据库。 (241 字节)
字符串和BLOB类型的大小最大可达 2G 字节(231字节)。
小的代码: 完整配置的少于250KB,忽略一些可选特性的少于150KB。
在大多数常见操作上比流行的客户/服务器数据库引擎更快。
简单,易于使用的API。
内建TCL绑定。 另外提供可用于许多其他语言的绑定。
具有良好注释的源代码,95%经过测试。
独立:没有外部依赖。
源代码位于公共域。 可用于任何用途。
SQLite用的非常广泛,Web应用也都在用它,PHP5都内置了SQLite的扩展,所以SQLite是桌面轻量级数据库的首选。除了Access和SQLite外,还有Firebird等数据库,我觉得SQLite足够小系统使用了。但是SQLite是通用的数据库系统,生成的数据库文件很容易用二进制编辑器打开,打开后文件首部赫然就是“SQLite format 3”,这就暴露了我们的数据文件是SQLite文件,数据库系统是SQLite,只要用SQLite工具打开这个文件就可以看到数据库中的内容了。那为了私密性我们能做哪些工作呢?
3. SQLite定制
我们有时为了私密性,不想让软件用户知道我们使用的数据库系统可以采取不同的加密措施。Access数据库可以设置密码达到保护数据的目的,但是Access的密码保存在Access的数据库文件中,用工具可以很容易的取得数据库的密码,这样我们的数据结构就很容易暴露给别人了。最安全的方法是我们自己编写数据库管理系统,这样我们的数据存储格式是私有的别人根本无法知道,这样即使他能看到文件中的二进制数据也没有办法直接看到数据模型的结构。但是,自己做一个数据库管理系统虽然不是太难,无非是存储管理,索引管理,SQL接口等,但如果没有相应的开发经验还是比较费时费力的,那我们能不能用“拿来主义”,用现成的数据库管理系统改造成我们自己的数据库管理系统呢?当然可以。就拿SQLite来说,它是全部开源的,可以从其网站上下载到最新的源代码,然后把源代码修改成我们自己的格式后进行编译就可以了。这对于Linux下的用户来说相当容易,但对于Windows下的不太用VC、BC的开发者来说,配置编译环境,配置导出DLL等操作还是比较费事的,我们就用现成的编译好的文件来修改吧。
用现成编译好的文件进行修改需要二进制的编辑器,推荐使用Ultraedit。为了更好的演示,我们假设用我比较熟悉的Delphi进行开发,用Delphi来访问SQLite可以采用两种方式:一种是用ODBC,SQLite提供ODBC的驱动;另外一种采用ASQLite组件进行访问,ASQLite是专门的封装SQLite DLL的组件包,可以在http://www.sqlite.com.cn/Upfiles/source/ASQLite.rar下载。我们选用ASQLite,对于ODBC的方法与ASQLite的类似,我们分步骤完成。
下载SQLite,可以在http://www.sqlitecn.org/download.html下载,我们下载Windows版本的,里面自带一个命令行工具用于建库等数据库操作。
下载ASQLite,并安装到Delphi中。
打开ASQLite的例子程序可以看到SQLite的演示,我们下面的修改以此例子程序为例。
ASQLite是sqlite3.dll的封装,我们要修改的是数据库文件、sqlite3.dll和ASQLite三个地方。
修改数据库文件。
数据库文件名为SampleDB,用UltraEdit打开此文件,在最上面可以看到“SQLite format 3”的字样,这是SQLite数据文件的标识,我们只需要修改这部分就可以了,比如修改为“CrazyCom DBEN 6”,最好和原长度一样,不一样的后面一定要改为“00”(十六进制)。
修改sqlite3.dll。
修改完上面的数据库文件后,如果这时运行例子程序会出现数据格式不对的提示,所以对sqlite3.dll进行相应的修改。
1)修改文件标识代码
打开sqlite3.dll,查找“SQLite format 3”,找到后改为“CrazyCom DBEN 6”,这样运行例子程序应该正常了。
2)修改函数导出表
我们用DLL、Exe的查看工具如Depend可以看到DLL导出了哪些函数,sqlite3.dll导出的函数都以“sqlite3_”打头的,这就暴露了我们使用的数据库是SQLite了,所以需要修改为不太容易辨识的名字如“crazydb_”打头。要修改首先要找到导出表的位置,在UltraEdit中查找“sqlite3_”,当看到很多字符串都是以“sqlite3_”开始的时候就找到了,具体应该在0x39db8偏移量处。这时如果运行例子程序,例子程序会报异常,因为它找不到相应的函数入口了,所以我们必须修改ASQLite的源文件。
修改ASQLite。
ASQLite是对sqlite3.dll的组件化封装,所有的调用还是通过sqlite3.dll实现的,既然我们修改了sqlite3.dll的导出函数接口,我们必须修改ASQLite中和sqlite3.dll的接口部分。接口文件就是ASGSQLite3.pas,打开此文件,找到TASQLite3DB.LoadLibs函数,看到了吧,这个函数加载sqlite3.dll,并找到各个函数。我们只需要修改各个函数的名称就可以了。当然要和sqlite3.dll的导出函数名称对应。
修改完后重新安装ASQLite。
重新编译例子程序,运行正常。到此已经基本完成了修改工作。
修改DLL名称。
由于SQLite的DLL名称是sqlite3.dll,很容易让人猜到是SQLite,我们可以把DLL的名字改掉,具体改什么名字可以随意,比如我们改为crazycomdb.dll。改完后要在例子程序中进行对应的修改,即设置TASQLite3DB的DriverDLL = 'crazycomdb.dll'。
4. 总结
本文给出了桌面轻量数据库的选择建议,比较了Access、SQLite两种数据库管理系统,并对定制SQLite数据库管理系统、增强其私密性、安全性提供了详细的步骤,给出了在Delphi下进行SQLite应用的具体例子。没有给出ODBC驱动的相关讨论,不过可以依据本文的方法类比进行。
via:http://blog.csdn.net/kernelspirit/archive/2007/03/07/1523061.aspx
桌面轻量级数据库的选择:Access、SQLite、自己编写?的更多相关文章
- 轻量级数据库sqlite的编译
sqlite是很多客户端程序所使用的一种轻量级数据库,但是目前没有lib文件,只有源码和dll文件,我们可以利用VS工具生成lib,然后在应用程序中使用. (1)下载地址 http://www.sql ...
- 无需部署的轻量级数据库—SQLLite,使用Demo
当有程序需要保存轻量数据,而又烦躁序列化到本地的不便,轻量级数据库—SQLLite是一个很好的选择,只需引用System.Data.SQLite.DLL,无需部署数据库,便可像拥有数据库一样保存数据, ...
- 在C#中利用Nuget包使用SQLite数据库和Linq to SQLite
本来是学习在VB中使用SQLite数据库和Linq to SQLite,结果先学习到了在C#中使用SQLite数据库和Linq to SQLite的方法,写出来与大家共同学习.(不知道算不算不务正业) ...
- 在VB中利用Nuget包使用SQLite数据库和Linq to SQLite
上午解决了在C#中利用Nuget包使用SQLite数据库和Linq to SQLite,但是最后生成的是C#的cs类文件,对于我这熟悉VB而对C#白痴的来说怎么能行呢? 于是下午接着研究,既然生成的是 ...
- Android数据库高手秘籍(一)——SQLite命令
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38461239 要想熟练地操作不论什么一个数据库.最最主要的要求就是要懂SQL语言, ...
- IOS中使用轻量级数据库
IOS中使用轻量级数据库 目录 概述 IOS中的轻量级数据库 sqlite的方法 数据库的实用操作 第三方类库 FMDatabase 概述 IOS中的轻量级数据库 sqlite的方法 sqlite3 ...
- Android数据库高手秘籍:SQLite命令
要想熟练地操作任何一个数据库,最最基本的要求就是要懂SQL语言,这也是每个程序员都应该掌握的技能.虽说SQL博大精深,要想精通确实很难,但最基本的一些建表命令,增删改查,大家还是必须要学会的. SQL ...
- ASP.net分别连接SQLserver数据库与连接Access数据库精英版
-------------------------连接access2003 字符串------------------------- Provider=Microsoft.Jet.OLEDB.4.0; ...
- LocalDB:微软的新生代轻量级数据库
什么是LocalDB 随着SQL Server 2012的发布,LocalDB跃入我们的视线,它可以被看做是SQL Server Express的轻量级版本.LocalDB专门为开发人员创建,它非常易 ...
随机推荐
- 确实,k8s的时代,ingress负载用traefik比nginx方便啊
参考文档: https://mritd.me/2016/12/06/try-traefik-on-kubernetes/#13ingress 由于微服务架构以及 Docker 技术和 kubernet ...
- 安卓屏幕旋转时,禁止Activity重新加载
安卓设备旋转屏幕时,Activity默认会重新加载,如果是要读取大量数据的场景,那等待的时间比较长,这一点不可接受,所以要想办法禁止Activity自动重新加载. 方法如下在AndroidManife ...
- 680. Valid Palindrome II【Easy】【双指针-可以删除一个字符,判断是否能构成回文字符串】
Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...
- Linux命令之route
route [-CFvnNee] [-A family] [-4|-6] route [-v] [-A family] [-4|-6] add [-net|-host] target [netmask ...
- Spring的安全机制
Spring Security:它提供全面的安全性解决方案,同时在Web请求和方法调用处理身份确认和授权,利用依赖注入和aop技术.主要名词: 1,安全拦截器:相当应用的一把锁,能够阻止对应用程序中保 ...
- Linux基础系列-Day7
NFS服务(基于CentOS 7.0) NFS(Network File System),网络文件系统,是linux与linux之间进行文件共享的服务,在NFS应用,本地NFS的客户端可以透明地读写位 ...
- rxjava 视频
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha Rxjava-基础篇视频教程-Rxjava框架的使用-麦子学院 它的自我介绍,我们可以理 ...
- [JSOI2018]军训列队
[JSOI2018]军训列队 题目大意: \(n(n\le5\times10^5)\)个学生排成一排,第\(i\)个学生的位置为\(a_i\).\(m(m\le5\times10^5)\)次命令,每次 ...
- windows下wnmp配置
windows下面apache结合laravel会出现env文件公用的问题,太麻烦,就换用nginx.问题:https://github.com/vlucas/phpdotenv/issues/219 ...
- [bzoj1010](HNOI2008)玩具装箱toy(动态规划+斜率优化+单调队列)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有 的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...