一个关于数据库和记事本文件的问题(100分)

  • 主题发起人 主题发起人 L.Q
  • 开始时间 开始时间
L

L.Q

Unregistered / Unconfirmed
GUEST, unregistred user!
各位兄弟姐妹:
大家好!小弟我现在碰到了难题,不能自己解决,希望大家能给小弟伸手帮忙。
问题是这样的:先把数据库表中的数据转成记事本文件,
再把记事本的文件转成数据库表中的信息。
谢谢!!
 
如果你要在程序中自己写,你可以用BatchMove,关于其用法,你在这儿搜一下,有许多相关资料.
如果数据有转换,你也可以自己写代码转入文本档,文本档转入数据库也是一样的.

如果你不需要在程序中写代码,你可以用Delphi的转库工具DataPump,只要在BDE中设定好即
可,文本的数据库引擎选Microsoft Text Driver,大致方法就是照上面的来,具体方法就自己
做了.
 
//这是数据库转文本文件的,文本文件转数据库的比这还容易,你自己写吧!
procedure DatToTxt;
var
F: TextFile;

FieldLen: array[0..30] of integer;
RecordStr: array[0..300] of char;
i,j: integer;
s: string;
pt: pointer;

// 检查文件是否存在
function CheckFile(F: string): Boolean;
begin
result:= True;
if FileExists(F) then
Application.MessageBox(pchar('文件已经存在!'),
pchar('提示'),MB_ICONINFORMATION or MB_OK)
else
result:= False;
end;
// 取得文件名
function OpenFile:Boolean;
begin
SaveFile_dlg.Title:= '指定文本文件'; //使用TSaveDialog控件
result:= False;
if SaveFile_dlg.Execute then
begin
if CheckFile(SaveFile_dlg.FileName) then
exit;
AssignFile(F, SaveFile_dlg.FileName+'.TxT');
Rewrite(F);
result:= True;
end;
end;
// 将各字段长度保存到数组
procedure GetFieldLen;
var
i: integer;
begin
with YourQuery do
for i:=0 to FieldDefs.Count-1 do
begin
if FieldDefs.Items.DataType= ftFixedChar then
FieldLen:= FieldDefs.Items.Size
else
if FieldDefs.Items.DataType= ftInteger then
FieldLen:= 8
else
if FieldDefs.Items.DataType= ftFloat then
FieldLen:= 8;
if Length(FieldDefs.Items.Name)>=FieldLen then
FieldLen:= Length(FieldDefs.Items.Name);
FieldLen:= FieldLen+2; // 防止各个字段输出后紧密相连
end;
FieldLen[ YourQuery.FieldDefs.Count]:= 0;
end;
begin
if YourQuery.RecordCount<=0 then
begin
Application.MessageBox(pchar('没有找到指定记录!'),
pchar('提示'),MB_ICONINFORMATION or MB_OK);
exit;
end;
if OpenFile then
try
try
GetFieldLen;

j:=0;
FillChar(RecordStr,300,' ');
with YourQuery do
for i:=0 to FieldDefs.Count-1 do
begin
s:= FieldDefs.Items.Name;
pt:= @s;
pt:= pointer(pt^);
move(pt^,RecordStr[j],Length(s));
j:=j+FieldLen;
end;
RecordStr[j]:= chr($0);
Writeln(F, RecordStr);

FillChar(RecordStr,j-1,'=');
Writeln(F, RecordStr);

with YourQuery do
begin
First;
s:='';
while not Eof do
begin
j:=0;
FillChar(RecordStr,300,' ');
for i:=0 to FieldDefs.Count-1 do
begin
s:= Fields.Fields.AsString;
pt:= @s;
pt:= pointer(pt^);
move(pt^,RecordStr[j],Length(s));
j:=j+FieldLen;
end;
RecordStr[j]:= chr($0);
Writeln(F, RecordStr);
Next;
end;
Application.MessageBox(pchar('输出完毕!'),
pchar('提示'),MB_ICONINFORMATION or MB_OK);
end;
finally
CloseFile(F);
end;
except
Application.MessageBox(pchar('运行出现错误,不能正常输出!'),
pchar('提示'),MB_ICONINFORMATION or MB_OK);
end;
end;
 
谢谢zhangkan和kk98的热心帮忙,程序是自己写的,我会用kk98的方法.
to:kk98,
我觉得比较困难的是文本文件转换成数据库信息,你说很容易,你的意思是不是把记事本
的数据分栏后、对应的写入数据库表中。请回答

非常感谢两位
 
在将文本转数据库时,也是先读取字段长度值,然后将文本文件的数据行读入后,
按照字段的长度进行分割就行了,分割得到的内容你可以直接赋值、或者用StrIntTo()
转换。
 
分已经送出,你们来拿吧!
再次谢谢kk98
 
后退
顶部