关于重复以及速度的问题(我这段代码执行没什么问题,唯独是速度太慢,哪位能帮我提提速啊)(200分)

  • 主题发起人 主题发起人 wp231957
  • 开始时间 开始时间
W

wp231957

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16:char;
t0:string;
label aa;
begin
Randomize;
if edit1.Text ='' then exit;
IF not(isnum(edit2.text)) then exit;
progressBar:=TProgressBar.Create(Form1);
//初始化进度条
with progressbar do begin
top:=progressbarrect.Top ;
left:=progressbarrect.Left ;
Width:=ProgressBarRect.Right-ProgressBarRect.Left;
Height:=ProgressBarRect.Bottom-ProgressBarRect.Top;
visible:=true;
Parent:=StatusBar1;
min:=0 ;
max:=STRTOINT(EDIT2.TEXT);
step:=1;
end;
adoquery1.ConnectionString:='provider=msdasql.1;persist info=true;data source=ms access database; Password=353535 ;initial catalog=base.mdb';
adoquery1.SQL.Text :='select * from '+edit1.Text ;
adoquery1.Open ;
for i:=1 to STRTOINT(EDIT2.TEXT) do begin
aa:
t1:=ss[random(35)]; //SS为取随机字符串的源
t2:=ss[random(35)];
t3:=ss[random(35)];
t4:=ss[random(35)];
t5:=ss[random(35)];
t6:=ss[random(35)];
t7:=ss[random(35)];
t8:=ss[random(35)];
t9:=ss[random(35)];
t10:=ss[random(35)];
t11:=ss[random(35)];
t12:=ss[random(35)];
t13:=ss[random(35)];
t14:=ss[random(35)];
t15:=ss[random(35)];
t16:=ss[random(35)];
//目的就是产生一个16位长的随机字符串
t0:=t1+t2+t3+t4+t5+t6+t7+t8+t9+t10+t11+t12+t13+t14+t15+t16;
adoquery1.First ;
for j:=1 to adoquery1.RecordCount do begin
//如果有相等则退出重新来过
if adoquery1.FieldByName('point_name').AsString =t0 then goto aa;
adoquery1.Next ;
end;
//没有相等,则向数据库中添加
adoquery1.Append ;
adoquery1.FieldByName('point_name').AsString:=t0;
adoquery1.Post;
progressbar.StepIt ;
end;
end;
 
晕,你的写法真是强,是刚才学Delphi吧。

其实稍改一下就行了。就在你的代码上改吧。(下面一些控件的名称和属性可能有些错误,记不太清了)
1、先在你的界面上放一个ADOConnection,再放多一个ADOQery(假设命名为qryFree)
2、把你的ADOConnection的ConnectionString设置为
provider=msdasql.1;persist info=true;data source=ms access database; Password=353535 ;initial catalog=base.mdb';
3、把你的ADOQuery1和新增的qryFree的conn属性全部设置为ADOConnection
4、加两个函数先(需要在加一个ADOQuery,假设叫qryFree)
//打开数据集
function OpenDataSet(DataSet: TDataSet; _SQL: String): String
begin
if _SQL = '' then Exit;
Result := '';

with TADOQuery(DataSet) do
try
Close;
SQL.Clear;
SQL.Text := _SQL;
Open;
except
On E: Exception do
Result := E.Message;
end;
end;

//获取记录数
function GetRc(_TableName, _Where: String): Integer
var ls_SQL, ls_Err: String;
begin
result := -1;
ls_SQL := 'SELECT COUNT(*) AS VAL FROM '+ _TableName + ' WHERE '+ _where
ls_Err := OpenDataSet(qryFree, ls_SQL);
if ls_Err <> '' then Exit;

Result := qryFree.FieldByName('VAL').asInteger;
end;

5、修改程序代码:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16:char;
ls_SQL, ls_Err, t0:string;
label aa;
begin
Randomize;
if edit1.Text ='' then exit;
IF not(isnum(edit2.text)) then exit;
progressBar:=TProgressBar.Create(Form1);
//初始化进度条
with progressbar do begin
top:=progressbarrect.Top ;
left:=progressbarrect.Left ;
Width:=ProgressBarRect.Right-ProgressBarRect.Left;
Height:=ProgressBarRect.Bottom-ProgressBarRect.Top;
visible:=true;
Parent:=StatusBar1;
min:=0 ;
max:=STRTOINT(EDIT2.TEXT);
step:=1;
end;

ls_SQL := 'select * from '+edit1.Text ;
ls_Err := OpenDataSet(adoQuery1, ls_SQL);
if ls_Err <> '' then Exit;

for i:=1 to STRTOINT(EDIT2.TEXT) do
begin
t1:=ss[random(35)]; //SS为取随机字符串的源
t2:=ss[random(35)];
t3:=ss[random(35)];
t4:=ss[random(35)];
t5:=ss[random(35)];
t6:=ss[random(35)];
t7:=ss[random(35)];
t8:=ss[random(35)];
t9:=ss[random(35)];
t10:=ss[random(35)];
t11:=ss[random(35)];
t12:=ss[random(35)];
t13:=ss[random(35)];
t14:=ss[random(35)];
t15:=ss[random(35)];
t16:=ss[random(35)];
//目的就是产生一个16位长的随机字符串
t0:=t1+t2+t3+t4+t5+t6+t7+t8+t9+t10+t11+t12+t13+t14+t15+t16;
//如果有相等则退出重新来过
if GetRc(edit1.Text, 'point_name='''+ t0 + '''')>0 then
Continue
else
begin
//没有相等,则向数据库中添加
adoquery1.Append ;
adoquery1.FieldByName('point_name').AsString:=t0;
adoquery1.Post;
progressbar.StepIt ;
end;
end;
end;
 
楼上真的用心来回答问题,应该加分
 
//获取记录数
function GetRc(_TableName, _Where: String): Integer ;
var ls_SQL, ls_Err: String;
begin
result := -1;
ls_SQL := 'SELECT COUNT(*) AS VAL FROM '+ _TableName + ' WHERE '+ _where ;
//这里我新添加了一个ADOQUERY控件,并命名为QRYFREE
//可是这里无法编译呢
ls_Err := OpenDataSet(qryFree, ls_SQL);
if ls_Err <> '' then Exit;
Result := qryFree.FieldByName('VAL').asInteger;
end;
 
提示什么?
 
我知道了,加为成员函数就OK了
否则它不认识表单中的控件
娃娃接分
 
呵呵,前后的速度有多大提升。
 
确实,具体没算过,但是肯定有很大的提升
 
后退
顶部