读取一个在实时更新的文本并存入数据库(100分)

  • 主题发起人 主题发起人 soulhuman
  • 开始时间 开始时间
S

soulhuman

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个一直在实时更新的文本,其内容的格式为:
200607071425230000001111
其中20060707为日期,142523为时间,0000001111为号码
请问,我要怎样去实时地读取这个文本,(即文本增加一行,我读到一行就写入数据库,不能写入重复的数据)并将文本这三段的内容存到数据库相应的字段中?
(数据库中对应的字段为日期,时间,号码)
 
你的实时,是多长时间一次啊?
如果时间间隔很小,我估计这样的方式未必好。你读的同时,可能别人在写,那会怎么样?
如果间隔时间长,你可以判断文件末尾长度吧?记录上次的位置。下次打开文件时从上次结束的位置开始。
 
读取的时间用户自己设置的,如果间隔小的话,真怕同时在写同时在读。会造成读取数据不完整。 我设了一个变量,记住上一次读取的行数,但如果程序重新运行的话,或者电脑重启,那个变量就是0了,就是说还要再从第一行重新读取。 该怎么办?
 
数据库中也记录最后一次读取的行数不就行了
 
顶.........
 
var SL:TStringList;
然后:
SL:=TStringList.Create;
SL.LoadFromFile(FileName);
然后你就可以比较了.比较的方法是将最近的数据保存到数据库或者ini文件.当然如果是数据库其实也不用比较,因为数据库相同数据不存在其实就可以直接保存了,写一个存储过程就可以了,用SQL语句判定.
 
通过OnTimer事件来控制啊!
function TfrmServer.WbdlDatabase(TbName,FileName:string):Boolean; //导入数据
var
ListString:TStringList;
ListJL:TStringList;
Str,StrSql:string;
i,j:integer;
limitedpos:integer;
Flag :integer;
begin
if TbName='AssignStatus' then //判断状态表的信息
begin
Qry_tmp.Close;
Qry_tmp.SQL.Clear;
Qry_tmp.SQL.Add('Select Count(*) as Num From AssignStatus');
Qry_tmp.Open;
Flag :=Qry_tmp.FieldByName('Num').AsInteger;
end
else
begin
Flag :=0;
end;
StrSql := 'select * from '+TbName;
Qry_tmp.Close;
Qry_tmp.SQL.Clear;
Qry_tmp.SQL.Add(StrSql);
Qry_tmp.Open;
Result := False;
ListString := TstringList.Create;
ListJL := TStringList.Create;
try
ListString.LoadFromFile(FileName);
for i:=Flag to ListString.Count-1 do //记录行数
begin
str := ListString.Strings;
ListJL.Clear;
while (Pos(',',Str)>0) or (str<>'') do
begin
limitedpos:=Pos(',',str);
if limitedpos <=0 then
begin
ListJL.Add(str);
Str := '';
end
else
begin
ListJL.Add(Copy(Str,1,limitedpos-1));
Str := Copy(Str,Pos(',',Str)+1,Length(Str));
end;
end;
Qry_tmp.Append;
for J :=0 to Qry_tmp.FieldCount-1 do //每行列数
begin
Qry_tmp.Edit;
if Qry_tmp.Fields[j].DataType =ftAutoInc then Continue;
if Qry_tmp.Fields[j].DataType =ftDateTime then
begin
if pos('-',ListJL.Strings[j])>0 then
Qry_tmp.Fields[j].AsString :=trim(ListJL.Strings[j])
else
begin
if LIstJL.Strings[j]<>'' then
begin
ListJL.Strings[j] := Copy(ListJL.Strings[j],1,4)+'-'+Copy(ListJL.Strings[j],5,2)+'-'+Copy(ListJL.Strings[j],7,2);
Qry_tmp.Fields[j].AsString := trim(ListJL.Strings[j]);
end;
end;
end
else
begin
if Qry_tmp.Fields[j].DataType =ftInteger then
begin
Qry_tmp.Fields[j].AsInteger :=StrToInt(ListJL.Strings[j]);
end;
if Qry_tmp.Fields[j].DataType =ftBoolean then
begin
if (ListJL.Strings[j] ='0') or (ListJL.Strings[j] = 'False') then
Qry_tmp.Fields[j].AsBoolean :=False
else
begin
if (ListJL.Strings[j] ='1') or (ListJL.Strings[j] = 'True') then
Qry_tmp.Fields[j].AsBoolean := True;
end;
end
else
if ListJL.Strings[j]<>'' then
begin
{if StrToInt(trim(ListJL.Strings[0])) <= Flag then
begin
ii :=Flag + 1;
break; //如果取到的最后行标志相同,指针下移
end
else
begin }
Qry_tmp.Fields[j].AsString := trim(ListJL.Strings[j]);
//Qry_tmp.Post;
// end;
end;
end;
end;
Qry_tmp.Post();
end;
Result := True;
except on e:Exception do
begin
ShowMessage(e.Message);
Application.Terminate;
end;
end;
end;
调用:
procedure TfrmServer.Timer1Timer(Sender: TObject);
var
fileName :string; //路径下文件名
begin
//效率表
fileName :=ExtractFilePath(Application.ExeName)+'MData/E_'+DateToStr(now)+'.zd';
if not FileExists(fileName) then
begin
ShowMessage('文件不存在!');
end
else
begin
if Readini then
begin
try
if (Wbdldatabase('AssignEfficiency',fileName)) then
begin
// ShowMessage('数据发送成功!');
end
else
begin
// ShowMessage('数据发送失败!');
// Abort;
end;
except on e:Exception do
begin
ShowMessage(e.Message);
end;
end;
end
else
begin
ShowMessage('数据库连接失败!');
Application.Terminate;
end;
end;
 
各位高手:小弟想知道如何从文本文件中读取数据再添加到数据库中去。
 
多人接受答案了。
 
后退
顶部