| 此段代码无论是速度、均衡性,还是随机度都非常好,也不会出现抽到重复记录的可能。 一、在SQL Server2000中生成随机记录的最好办法: withtk_querydo
begin
Close;
sql.clear;
sql.Add('selecttop' inttostr
(st_count) 'tk.ID,标准答案from题库表tk');
sql.Add('wherepidisnullandtk.题型=
' quotedstr(tx) 'andtk.知识点=' quotedstr(zsd));
sql.add('andtk.难易度=' quotedstr(nyd)
'andtk.课程号=' quotedstr(kcdm) 'orderbynewid()');
Open;
end; |
注:要害就是orderbynewid()这条语句,随机因子就是从这里产生。 二、数据库为Access2000时生成随机记录的最好办法: 由于Access中没有newid()这一随机函数,故要想在Access中直接由SQL语句生成我们所希望的随机记录不太可能,因此我们只好在开发语言中生成合适SQL语句,让Access执行了。 //获取题库表中的随机ID,组成一个字符串,类似这样(3,8,2,25,49,1,7,10,6,83....) //kcdm:课程代码,tx:题型,zsd:知识点,nyd:难易度,t_count:某一题型某一知识点某一难度下的要抽取的题量 functionTTest_Srv_RDataForm.Get_Random_ID
(constkcdm,tx,zsd,nyd,t_count:string):string;
var
sl:TStrings;
i,ii,kk:integer;
begin
try
Result:='';
sl:=TStringList.Create;
withTADOQuery.Create(nil)do
begin
try
Connection:=Adoconnection1;
SQL.Text:='selectIDfrom题库表
wherepidisnulland题型=' quotedstr(tx)
'and知识点=' quotedstr(zsd) 'and难易度=' quotedstr(nyd)
'and课程号=' quotedstr(Kcdm);
Open;
whilenotEofdo
begin
sl.Add(Fields[0].AsString);
Next;
end;
Close;
finally
Free;
end;
end;//endwith....
ifsl.Count=0then
Exit;
fori:=0toStrToIntDef(t_count,0)-1do
begin
kk:=sl.Count;//随机因子
Randomize;
ii:=Random(kk);//取得随机数
ifResult=''then
Result:=sl.Strings[ii]
else
Result:=Result ',' sl.Strings[ii];
sl.Delete(ii);
//为了避免有可能出现的重复,此ID被抽取过后把它删了
ifsl.Count=0then
//假如无题可抽了退出循环
Break;
end;
Result:='(' Result ')';
//给结果串前后加上(......),最终形成(24,36,5,89,72,3,6,1....)的串样
finally
sl.Free;
end;
end;
//=================课程号,题型,知识点,难易度,题量
functionTTest_Srv_RDataForm.Get_Random_Sql
(constkcdm,tx,zsd,nyd,t_count:string):string;
begin
Result:=Get_Random_ID(kcdm,tx,zsd,nyd,t_count);
ifResult<>''then
Result:='selecttop' t_count 'tk.ID,
标准答案from题库表tkwhereidin' Result
else
Result:='selecttop' t_count 'tk.ID,
标准答案from题库表tkwhere1=1';
end;
//以下为调用上述函数生成随机抽题的代码片断
.......
withtk_querydo
begin
Close;
sql.Clear;
sql.Text:=Get_Random_Sql(Kcdm,tx_str,zsd_str,nyd_str,txzsd_count_str);
Open;
end;
|
| 共2页: 上一页 1 [2] 下一页 |
评论加载中…
|