一、在MS SQL Server 2000中生成隨機記錄的最好辦法:
with tk_query do
begin
Close;
sql.clear;
sql.Add('select top '+inttostr(st_count)+' tk.ID,標准答案 from 題庫表 tk');
sql.Add('where pid is null and tk.題型='+quotedstr(tx)+' and tk.知識點='+quotedstr(zsd));
sql.add('and tk.難易度='+quotedstr(nyd)+' and tk.課程號='+quotedstr(kcdm)+' order by newid()');
Open;
end;
注:關鍵就是 order by newid() 這條語句!隨機因子就是從這裡產生的。
二、數據庫為Access 2000時生成隨機記錄的最好辦法:
由於Access中沒有newid()這一隨機函數,故要想在Access中直接由SQL語句生成我們所希望的隨機記錄不太可能,因此我們只好在開發語言中生成合適SQL語句,讓Access執行了(博主的開發工具為Delphi)。
//獲取題庫表中的隨機ID,組成一個字符串,類似這樣 (3,8,2,25,49,1,7,10,6,83....)
//kcdm:課程代碼,tx:題型,zsd:知識點,nyd:難易度,t_count:某一題型某一知識點某一難度下的要抽取的題量
function TTest_Srv_RDataForm.Get_Random_ID(const kcdm,tx,zsd,nyd,t_count:string):string;
var
sl: TStrings;
i,ii,kk: integer;
begin
try
Result := '';
sl := TStringList.Create;
with TADOQuery.Create(nil) do
begin
try
Connection := Adoconnection1;
SQL.Text := ' select ID from 題庫表 where pid is null and 題型='+quotedstr(tx)+
' and 知識點='+quotedstr(zsd)+' and 難易度='+quotedstr(nyd)+
' and 課程號='+quotedstr(Kcdm);
Open;
while not Eof do
begin
sl.Add(FIElds[0].AsString);
Next;
end;
Close;
finally
Free;
end;
end; //end with ....
if sl.Count=0 then
Exit;
for i := 0 to StrToIntDef(t_count,0)-1 do
begin
kk := sl.Count;//隨機因子
Randomize;
ii := Random(kk); //取得隨機數
if Result='' then
Result := sl.Strings[ii]
else
Result := Result+','+sl.Strings[ii];
sl.Delete(ii); //為了避免有可能出現的重復,此ID被抽取過後把它刪了
if sl.Count=0 then //如果無題可抽了退出循環
Break;
end;
Result := '('+Result+')'; //給結果串前後加上(......),最終形成(24,36,5,89,72,3,6,1....)的串樣
finally
sl.Free;
end;
end;
//=============================================== 課程號,題型,知識點,難易度,題量
function TTest_Srv_RDataForm.Get_Random_Sql(const kcdm,tx,zsd,nyd,t_count:string):string;
begin
Result := Get_Random_ID(kcdm,tx,zsd,nyd,t_count);
if Result <> '' then
Result := ' select top '+t_count+' tk.ID,標准答案 from 題庫表 tk where id in '+Result
else
Result := ' select top '+t_count+' tk.ID,標准答案 from 題庫表 tk where 1=1 ';
end;
//以下為調用上述函數生成隨機抽題的代碼片斷
.......
with tk_query do
begin
Close;
sql.Clear;
sql.Text := Get_Random_Sql(Kcdm,tx_str,zsd_str,nyd_str,txzsd_count_str);
Open;
end;