我做了个程序将edit 框里输入的条形码添加到一个listbox里,录完后将listbox里存储的条形码批量的插入数据库。但当从edit框输入到listbox的条形码达到一千多条时,处理速度慢得不能接受,请问有什么方法可以提高速度?

解决方案 »

  1.   

    以下是从edit将条码录入到listbox的源码,当数量多的时候,录入会越来越慢。
    procedure Tfrminput.Button5Click(Sender: TObject);
    var
    opensql:string;
    i:integer;
    begin
    //加条码位数及字符判断
    if not ((length(edit2.Text)=13) or (length(edit2.Text)=11)) then
      begin
      showmessage('条形码的位数不正确,请检查!');
      edit2.clear;
      edit2.SetFocus;
      abort;
      end;
     //检查数据库中是否有此条码的资料,如果有则不录入
     begin
       opensql:='select * from t_sys_tab1 where yjtm='''+UpperCase(edit2.Text)+''' and yjzt<>5 and ffrq is not null';
       try //
       if pubquery.Active then pubquery.Close;
       pubquery:=openquery(opensql,psession);  //这里执行sql语句
       except
       showmessage('操作失败!');
       end;
       if pubquery.RecordCount=0 then
        begin
        opensql:='select * from t_sys_tab2 where yjtm='''+UpperCase(edit2.Text)+''' and yjzt<>5 and ffrq is not null';
        try //
        if pubquery.Active then pubquery.Close;
       pubquery:=openquery(opensql,psession); //这里执行sql语句
       except
       showmessage('操作失败!');
       end;
       if pubquery.RecordCount=0 then
        begin
        opensql:='select * from t_sys_tab3 where yjtm='''+UpperCase(edit2.Text)+''' and yjzt<>5 and ffrq is not null';
        try //
        if pubquery.Active then pubquery.Close;
       pubquery:=openquery(opensql,psession); //这里执行sql语句
       except
       showmessage('操作失败!');
       end;
       if pubquery.RecordCount=0 then
       begin //插入到listbox里
       //---------
      for i:=0 to Listbox1.Items.Count do
      begin
        if ListBox1.Items.Indexof(edit2.Text)<0  then
        begin
           listbox1.Items.Add(UpperCase(edit2.Text));
           n:=n+1;
           label4.Caption:=inttostr(n);
           edit2.Clear;
        end
          else
           edit2.Clear;
           edit2.SetFocus;
           abort;  end;
      //-------------
       end
       else
        begin
       showmessage('该条码已存在,请勿重复录入!');
       edit2.clear;
       edit2.SetFocus;
       abort;
       end;
        end
        else
         begin
       showmessage('该条码已存在,请勿重复录入!');
       edit2.clear;
       edit2.SetFocus;
       abort;
       end;
        end
        else
         begin
       showmessage('该条码已存在,请勿重复录入!');
       edit2.clear;
       edit2.SetFocus;
       abort;
       end;
        end;end;  
      

  2.   

    你的查询不要带那么多参数,你的SQL语句可以改进一下,如直接用where 条形码='条形码内容' ,uppercase(edit2.text)一开始就赋值给一个变量,避免重复使用uppercase,另外,最大影响速度的是for语句,每新增一个条码就用一次listbox1.items.add(条码)即可,因为前面三个表都无此条码,就不用再if了
    for i:=0 to Listbox1.Items.Count do
      begin
        if ListBox1.Items.Indexof(edit2.Text)<0  then
        begin
           listbox1.Items.Add(UpperCase(edit2.Text));
           n:=n+1;
           label4.Caption:=inttostr(n);
           edit2.Clear;
        end
          else
           edit2.Clear;
           edit2.SetFocus;
           abort;