访问数据库进度条。
我用ADO访问一个数据库表(数据库在网络上的),表中有二进制类型字段。所以打开非常慢!我想在ADO.open的时候,做个进度条来显示当前 打开的进度!请告诉帮忙!
[解决办法]
我也想啊,等以后数据库系统改进吧。
[解决办法]
先跟 IBM, Microsoft等反映下。
[解决办法]
有谁实现了给我一份
[解决办法]
等。我去年做项目的时候做到过进度条,给你代码自己去看吧!~有什么不会的地方给我发消息,
这个是条形码的导入数据库的代码!~
[解决办法]
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.
[解决办法]
进度条用的是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;
这些读数据!
[解决办法]
就是给他设置一个MDI窗体,然后设置JDFROM设置属性show出来显示在中央,这样就可以了!~
[解决办法]
不知道,谁给你说的ADO异步实现呢?
学习!~
[解决办法]
分步读吧.比如你要1万条,分10次,每次读1000条,就可以设进度了,只是不能用dbgrid了.
[解决办法]
我是里面有 二进制的字段 大的很
________________________________
你的Select语句里不要包含那个大数据的字段,只是在需要的时候一个个取不就行了.
[解决办法]
这样:把ADO数据集的缓冲记录数改的很小,打开后对数据集进行While not Eof next循环,一边循环,一边Application.ProcessMessages。这样就非常自然而稳定了。