桌面轻量级数据库的选择: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专门为开发人员创建,它非常易 ...
随机推荐
- sqlserver 构架与性能优化
太阳底下没有新鲜事 一.sqlserver 构架结构 1.查询优化器三阶段 1).找计划缓存如果找到直接使用 2).简单语句生成0开销的执行计划 3).正式优化 一般情况下优化到开销小于1.0就会停止 ...
- 网站页面SEO的三个标签怎么写有利【转载】
转载自:代明博客 在SEO界,自从夫唯老师提出“四处一词”的概念以来,不管是搜索引擎还是SEOer,都格外重视页面的三个标签.三个标签书写是否成功,在很大程度上决定了网页是否能有好的排名.今天代明博客 ...
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- 循序渐进PYTHON3(十三) --2-- DJANGO之FORM表单(自动生成HTML标签和自定制提示信息)
在上一次的代码上做出进一步修改,使之能在页面上显示自定制的报错信息,并且使用form自动创建标签的功能. views.py from django.shortcuts import render,Ht ...
- PLSQL的注释技巧
概述 这里提供一些注释的技巧,用来模仿Java中的文档注释的功能. 在Eclipse中,鼠标悬浮在类或其成员上,会显示相关的文档注释:在PL/SQL中也有类似的功能,我们需要掌握一些注释技巧,让其可读 ...
- 【大杀器】利用划分树秒杀区间内第k大的数
最近看了一道题,大概就是给出一个序列,不断询问其子区间内第k大的数,下面是个截图 绕了一圈没找到中文版题目,if(你是大佬) then 去看截图:else{我来解释:给出一个整数n,和一个整数m,分别 ...
- 【go】继续go go go,ubuntu环境搭建及golang的依赖关系分析
这次是在ubuntu14.04 amd64上搭建go的编译环境,使用的IDE换成了sublime text,具体步骤参照的是 http://blog.csdn.net/aqiang912/articl ...
- 关于 CommonJS AMD CMD UMD
1. CommonJS CommonJS 原来叫 ServerJS, 是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用requi ...
- CXF浅析
CXF 框架支撑环境 CXF 框架是一种基于 Servlet 技术的 SOA 应用开发框架,要正常运行基于 CXF 应用框架开发的企业应用,除了 CXF 框架本身之外,还需要 JDK 和 Ser ...