procedure TFormDAORU.RzButton2Click(Sender: TObject);
var
mylist:TStringlist;
i1,i2:integer;
s1,s2:string;
j1,j2,j3,j4,j5,j6,j7,j8:string;
begin
if edt1.text<>'' then
begin
s2:='第';
mylist:=TStringlist.Create;
mylist.LoadFromFile(Trim(edt1.Text));
i1:=mylist.Count;
//ShowMessage(mylist[0]);
if i1>0 then
begin
for i2 :=1 to i1 do
begin
try
if Length(trim(mylist[i2-1]))=28 then //初步判断正常就尝试导入
begin
j1:=copy(trim(mylist[i2-1]),1,7);
j2:=copy(trim(mylist[i2-1]),9,2);
j3:=copy(trim(mylist[i2-1]),12,2);
j4:=copy(trim(mylist[i2-1]),15,2);
j5:=copy(trim(mylist[i2-1]),18,2);
j6:=copy(trim(mylist[i2-1]),21,2);
j7:=copy(trim(mylist[i2-1]),24,2);
j8:=copy(trim(mylist[i2-1]),27,2);
with DBISAMQuery1 do
begin
close;
SQL.Clear;
s1:='insert into record(qihao,r1,r2,r3,r4,r5,r6,b) '+
'values(:A,:B,:C,:D,:E,:F,:G,:H)';
SQL.Add(s1);
Params.ParamByName('A').Value:=j1;
Params.ParamByName('B').Value:=j2;
Params.ParamByName('C').Value:=j3;
Params.ParamByName('D').Value:=j4;
Params.ParamByName('E').Value:=j5;
Params.ParamByName('F').Value:=j6;
Params.ParamByName('G').Value:=j7;
Params.ParamByName('H').Value:=j8;
ExecSQL;
end;
end
else //初步判断不正常就放弃导入该记录,并记载异常条数提示
s2:=s2 + IntToStr(i2)+'条、' ;
except
s2:=s2 + IntToStr(i2)+'条、' ;
end;
end;
if length(s2)=2 then
ShowMessage('数据导入成功!')
else
begin
copy(s2,1,length(s2)-2);
ShowMessage('数据导入结束,'+s2+'记录导入失败!');
end;
DBISAMQuery1.Close;
end
else
ShowMessage('无记录!');
mylist.Free;
end;
end;
上面是一段从txt文件向dbisam数据库导入数据的小程序。非常简单,初看没有什么毛病。但是在调试的时候,程序无法执行正常的导入操作——即使数据源没任何毛病,直接就跑到异常处理那块,报告所有记录条数导入失败。因为在这之前写过数据录入模块和数据浏览模块,若在执行导入操作前先点开录入窗口或者浏览窗口,再执行导入就没有任何问题。在单步调试的时候也发现,程序直接就在SQL.clear前的close这个断点直接就跳到了except那里去了,也即DBISAMQuery控件在执行close事件时触发了异常!我去,在更新sql语句前不关闭DBISAMQuery行吗?很郁闷。没奈何,只好在导入窗体的show事件里画蛇添足地添加了下面这段
DBISAMQuery1.close;
DBISAMQuery1.sql.Text:='select * from record';
DBISAMQuery1.open;
表面上一切正常,但还是觉得这种方式很有点说不过去。请高手指点一下,是不是我的导入部分存在问题?