我用ADO访问一个数据库表(数据库在网络上的),表中有二进制类型字段。所以打开非常慢!我想在ADO.open的时候,做个进度条来显示当前 打开的进度!请告诉帮忙!

解决方案 »

  1.   

    先跟 IBM, Microsoft等反映下。
      

  2.   

    不是有人用ADO异步操作来实现这个问题!但是我不会。请高手指点!
      

  3.   

    unit drsj;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids;
    type
      TForm3 = class(TForm)
        Button1: TButton;
        OpenDialog1: TOpenDialog;
        ADOQuery1: TADOQuery;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        Label1: TLabel;
        Edit1: TEdit;
        Label2: TLabel;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    var
      Form3: TForm3;
      coon: string;
    implementation
    uses jdfrm, dmfrm;
    {$R *.dfm}
    procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      action := cafree;
    end;
    procedure TForm3.FormDestroy(Sender: TObject);
    begin
      Form3 := nil;
    end;
    procedure DetachString(var SaveSt: TStringList; const DetachSt, DetachCh: string);
    var
      DetachLen: Integer;
      St, S, Str: string;
      i: Integer;
    begin
      St := DetachSt;
      S := DetachCh;
      DetachLen := Length(DetachCh);
      if SaveSt = nil then
        Exit;
      while True do
      begin
        i := Pos(S, St);
        if i <= 0 then
        begin
          if St <> '' then
            SaveSt.Add(St);
          break;
        end;
        Str := Copy(St, 0, i - 1);
        St := Copy(St, i + DetachLen, Length(DetachSt) - i);
        SaveSt.Add(Str);
      end;
    end;procedure TForm3.Button1Click(Sender: TObject);
    var
      filename: string;
      slist, str: tstringlist;
      i: integer;
      s, rcklb, strsql: string;
      cxquery: Tadoquery;
    begin
      rcklb := '';
      slist := Tstringlist.Create; file://存放文件所有内容--声明
      if opendialog1.Execute then
      begin
        filename := opendialog1.FileName;
        slist.LoadFromFile(filename); file://实现
        for i := 0 to slist.Count - 1 do file://循环实现对每行操作
        begin
          str := Tstringlist.Create;
          s := slist[i];
          Detachstring(str, s, ','); file://调用自定义函数 分割字符串(针对每行重复操作)
          if str.Count = 3 then file://屏蔽非标准数据
          begin
            if not assigned(jdform) then file://标识导入进程
            begin
              jdform := Tjdform.Create(application);
              jdform.Show;
            end;
            jdform.ProgressBar1.Max := slist.Count-2;
            file://查询数据库 得出入库出库标识
            cxquery := Tadoquery.Create(self);
            cxquery.Connection := dmform.Adoconnection1;
            with cxquery do
            begin
              close;
              sql.Text := 'select * from ry where bh=''' + str[0] + '''';
              open;
              if not eof then file://检查当前数据是条码还是入出库标识
              begin
                rcklb := fieldbyname('rm').AsString;
                continue; file://如果是标识 此条数据不保存 保存接下来的数据
              end;
              if rcklb <> '' then file://主要目的为屏蔽第一条标识数据
              begin
                close;
                strsql := 'insert into tm(tm,ckr,smrq,smsj,sj) values(''' + str[0] + ''',';
                strsql := strsql + '''' + rcklb + ''',''' + str[1] + ''',''' + str[2] + ''',';
                strsql := strsql + '#' + FormatDateTime(' yyyy - MM - dd ', date) + '#)';
                sql.Text := strsql;
                ExecSQL;
                dbgrid1.Columns[0].Width:=50;
              end;
            end;
          end
          else
          begin
            showmessage('检测到不符合格式数据,读取中止!');
            str.Free;
            slist.Free;
            if jdform <> nil then
              jdform.Close;
            exit;
          end;
          str.Free;
          jdform.ProgressBar1.Position := i;
        end;
        slist.Free;
        showmessage('        输入成功       !');
      end;
      if jdform <> nil then
        jdform.Close;
      adoquery1.Close;
      adoquery1.SQL.Clear;
      adoquery1.SQL.Add('select * from tm order by sj desc,smrq desc,smsj desc');
      adoquery1.Open;
      edit1.Text := inttostr(adoquery1.RecordCount);
    end;
    end.
      

  4.   

    进度条用的是ProgressBar1放到一个窗体上,然后等录入数据的时候,调用
    if not assigned(jdform) then file://标识导入进程
            begin
              jdform := Tjdform.Create(application);
              jdform.Show;
            end;
    把这个窗体SHOW出来,然后在最后一段
    if jdform <> nil then
        jdform.Close;
      adoquery1.Close;
      adoquery1.SQL.Clear;
      adoquery1.SQL.Add('select * from tm order by sj desc,smrq desc,smsj desc');
      adoquery1.Open;
      edit1.Text := inttostr(adoquery1.RecordCount);
    end;
    这些读数据!·
      

  5.   

    就是给他设置一个MDI窗体,然后设置JDFROM设置属性show出来显示在中央,这样就可以了!~
      

  6.   

    我知道这些方法,我是想能在ADO。OPEN的时候,取的ADO的进度。
      

  7.   

    有人说用ADO异步实现,那样 ADO。OPEN的时候,马上返回。通过方法事件取的ADO当前的进度。但我不知道怎么实现。
      

  8.   

    不知道,谁给你说的ADO异步实现呢?
    学习!~
      

  9.   

    分步读吧.比如你要1万条,分10次,每次读1000条,就可以设进度了,只是不能用dbgrid了.
      

  10.   

    我是里面有 二进制的字段 大的很
    ________________________________
    你的Select语句里不要包含那个大数据的字段,只是在需要的时候一个个取不就行了.
      

  11.   

    还是不行的!就比如我把A.ARA 这个文件放在表里!我就单独取这个文件就要话好长时间!特别在外网情况下!所以就出现: 容易死机,界面不友好等的问题了!
      

  12.   

    这样:把ADO数据集的缓冲记录数改的很小,打开后对数据集进行While not Eof next循环,一边循环,一边Application.ProcessMessages。这样就非常自然而稳定了。