数据库(50分)

  • 主题发起人 主题发起人 hhh
  • 开始时间 开始时间
H

hhh

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi能否像visual foxpro 那样将数据库打包只可执行文件中?
 
参见动态生成Exe文件.
 
最好不这样做,delphi开发大型程序,数据库都不小!
 
那这个数据库是动态的,还是静态的?
 
什么应用需要将数据库打包进exe?
如果数据量大这样做很不好(加载一个几十兆的exe可不是一件轻松的事, 并且数据的修改,添加都有麻烦)
如果数据量很小, 有必要用数据库吗? 毕竟bde有4-5兆, 发布300k的小程序(例如通讯录什么的)
携带4-5兆的数据库接口库可不是一个好主意.
 
I have never know VFP could include whole database into a EXE file.
It's terrible!
End this quession please.
 
静态数据库,百兆容量.
目的:保护数据
 
要打包数据库进exe完全不是一件复杂的事(事实上相当简单, 加到resource文件里一起
编译就成了)
使用时把resource里的内容写入一个临时文件即可进行数据库操作了.
但是这样做的限制很多, 首先, 你不能修改该数据库的内容, 即使改也只是改动临时
库, 因为原始库的内容在exe中. 如果硬要修改, 也不是办不到, 但方法相当复杂,
而且不是该程序自身能够完成的,必须想办法生成或调用另一个exe, 同时关闭自己,让
另一个程序完成接下的操作. 做完之后再重新运行, 难度和复杂度可想而知(变态?).
其次, 一个100M+的exe文件是不是能正常运行不出问题还不得而知.
第三, 如果先压缩再打包, 又增加了编程的难度(读取时还要处理解包).
讲了这么多不好的地方, 打包的方法如下(通过.res, 这是最方便的方法了), 您自己
考虑一下:
1. 用任何文本编辑器生成一个后缀名为rc的文本文件,如"myres.rc".
2. 文本中格式如下:

1 RCDATA "C:/TEMP/MYDBF.DBF"
^^^ ^^^^^^ ^^^^^^^^^^^^^^^^^^^
ID 数据类型 需要打包进.res的文件

2 RCDATA "C:/TEMP/MYDBF.MDX"

每行定义.res中的一项
3. 用BRCC32.EXE 把.rc文件编译成.res
命令行为:
BRCC32.EXE myres.rc
4. 在你的工程文件(.dpr)中加上
{$R MYRES.RES}
重新编译即可
运行时可通过读取resource中的内容生成一个临时数据库进行操作, 具体方法如下:
procedure TForm1.FormCreate(Sender: TObject);
var
ResStream: TResourceStream;
begin
ResStream:=TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);
ResStream.SaveToFile('myres.dbf');
ResStream.Free;
ResStream:=TResourceStream.CreateFromID(HInstance, 2, RT_RCDATA);
ResStream.SaveToFile('myres.mdx');
ResStream.Free;
end;
这样生成的myres.dbf就是你打包进exe里的数据库了. 如果不带索引(或者准备临时
create index), 这个dbf可以取任何名称. 否则该dbf名称必须和打包前一致(不然
报找不到mdx错).
 
还不如对数据库内容采取一定算法加密,程序再解密。
 
那么大的数据库推荐使用SQL SERVER DESKTOP之类的东西,可以自己
加密也可以通过打包
 
接受答案了.
 
后退
顶部