我想像QQ聊天记录或foxmail邮件那样保存数据,不用专门的数据库,如何实现?(100分)

  • 主题发起人 主题发起人 zouwenyan
  • 开始时间 开始时间
Z

zouwenyan

Unregistered / Unconfirmed
GUEST, unregistred user!
不知有没有专门的小小型数据库可以实现那样把数据存在文本或其它格式的文件里,
还可以支持简单检索的?用什么方法或工具?好急啊,各大侠帮帮我!
 
自己存到文件里啊,在文件里检索也有方法啊
 
lcl_003老师:
您说的存到自己的文件里,是以二进制或者16进制写进文本文件吗?文件检索在delphi
里怎么实现,我一点头绪都没有,您能告诉一些方法或资料的地方吗?谢谢!
 
存到文件里的格式自己定义,只要能存能读就可以。检索看下面代码,你自己可以改改

procedure TForm1.Button1Click(Sender: TObject);
var
wj:File;
fb:String[20];
br:integer;
begin
assignfile(wj,'文件名');
reset(wj,1);
while not eof(wj) do begin
blockread(wj,fb,sizeof(fb),br);
if pos('指定字符',fb)>0 then Button1.Caption:='找到拉';
end;
Closefile(wj);
end;

 
定义一个结构体!保存到一个文件中!
 
lcl_003:
我觉得这样在文件中查找字符块不是很好吧,我是要二个字段这样的功能,一个存名称
一个存对应的文件名,我查了些资料好像说是clientdateset可以做到,存成了一个.cds
文件,只是还不太清楚怎么用。
您专家分那多啦,一定可以帮我的,再帮我想下,谢谢啦:)
 
用文件数据库存储呢?我正在用DBISAM,你也可以试一下,比较方便的~!
 
这样查找字符是不太好,算法还可以改进。
》》我是要二个字段这样的功能,一个存名称一个存对应的文件名
啥意思,没明白
foxmail是存在一个文件in.box,out.box里啊
 
给你一些代码参考
type
PRec = ^TRec;
TRec = record
Section: string[20];
Ident: string[20];
Value: string[50];
end;
|
procedure SetCfgs(const sSection, sIdent, sValue, sFileName: pchar;
skey: pchar = nil); stdcall;
var
frec: PRec;
tmpsttram: TDataStream;
begin
new(frec);
tmpsttram := TDataStream.create(sFileName);
try
tmpsttram.key := strpas(skey);
frec^.Section := strpas(sSection);
frec^.Ident := strpas(sIdent);
frec^.Value := strpas(sValue);
if ((tmpsttram.Size mod tmpsttram.RecSize) = 0) and
(tmpsttram.Size >= tmpsttram.RecSize) then
begin
tmpsttram.SetIniOptionEX(frec^);
end else
begin
raise Exception.Create('写文件错误!');
end;
finally
dispose(frec);
tmpsttram.Free;
end;
end;
 
to zouwenyan: 用clientdataset也可以,启动程序时将数据从文件中导入到clientdataset中,
中间过程就只在内存中更新,程序退出时保存到文件中。但如果程序在中间出错退出,就无法
保存数据了。

一个表保存到一个文件里,先如下创建clientdataset,with ClientDataSet1 do
begin
with FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'Field1';
end;
with FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size := 10;
Name := 'Field2';
end;
with IndexDefs.AddIndexDef do

begin
Fields := 'Field1';
Name := 'IntIndex';
end;
CreateDataSet;
end;
然后clientdataset1.loadfromfile,最后clientdataset1.savetofile。中间就用clientdataset.insert,edit,delete进行操作。
 
谢谢大家的热心建议!
我正是用clientdataset做的,有个问题请教zhjwjan:
我的clientdataset带参数查询和不带是一样的,就是无轮参数是什么,它都全部检索出来
:(,源码如下:
data1.DataModule1.ClientDataSet1.CommandText := 'select * from grade_template where subject like :p_sub';
data1.DataModule1.ClientDataSet1.Params.ParamByName('p_sub').asstring:=combobox1.text;
parambyname('p_sub').asstring:=combobox1.text;
data1.DataModule1.ClientDataSet1.Open ;
为什么参数不起做呢?
 
to zouwenyan: clientdataset是用来保存查询到的数据到本地内存里的,即用commandtext
去查询远程数据库,结果就放在clientdataset里,这就是你所想要的数据了。你要在clientdataset里
再查找或更新的话,只能用dataset自己的方法,不能用sql语句:
更新
Append,AppendRecord,insert,insertrecord, delete, edit, post
查找: FindField
FindFirst
FindLast
FindNext
FindPrior
First
Last
Locate
Lookup
MoveBy
Next
Prior
 
用TinyDB控件吧!
 
谢谢大家,谢谢zhjwjan老师,我试下,不行的话还来这问:)
我的QQ:16715873,希望能和大家一起学习!
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部