中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > MSSQL Server
SQL Server和Access分别可取得随机记录
作者:010032 时间:2007-06-26 15:14 出处:ccidnet.com 责编:月夜寒箫
              摘要: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;
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有