SQL Server和Access分别可取得随机记录

此段代码无论是速度、均衡性,还是随机度都非常好,也不会出现抽到重复记录的可能。

一、在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;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值