我想一次从数据库中取出若干条随机记录,该怎么办呀?
每次取出的值不能重复,不能位空值!(ACCESS数据库,ID位递增)
我的想法如下:
var j:integer;
    temp:string;
begin
jg.Clear;
jg.Items.Add('以下是三等奖的获奖名单!(10个)');
zhjg.Items.Add('以下是三等奖的获奖名单!(10个)');
try
for j :=0  to 9 do
begin
 i:=adoquery2.RecordCount;
 randomize;
 adoquery1.Close;
 adoquery1.SQL.Clear;
 adoquery1.SQL.Add('select * from a where id=:id');
 adoquery1.Parameters.ParamValues['id']:=random(i);
 adoquery1.Open;
 temp:=adoquery1.FieldValues['a'];
 jg.Items.Add(temp);
 zhjg.Items.Add(temp);
 end;
except
end;
end;

解决方案 »

  1.   

    var j:integer;
        temp:string;
        SL: TStringList;
    begin
    jg.Clear;
    jg.Items.Add('以下是三等奖的获奖名单!(10个)');
    zhjg.Items.Add('以下是三等奖的获奖名单!(10个)');
    Sl := TStringList.Create;
    try
     i:=adoquery2.RecordCount;
     randomize;
    j := 0;
    while j < 10 do
    begin
     adoquery1.Close;
     adoquery1.SQL.Clear;
     adoquery1.SQL.Add('select * from a where id=:id');
     adoquery1.Parameters.ParamValues['id']:=random(i);
     adoquery1.Open;
     if adoquery1.IsEmpty then
       Continue;
     
     temp:=adoquery1.FieldValues['a'];
     if SL.IndexOf(temp) >= 0 then
       Continue; 
     jg.Items.Add(temp);
     zhjg.Items.Add(temp);
     SL.Add(temp);
     Inc(j);
     end;
     SL.Free;
    except
    end;
    end;
      

  2.   

    首先要小小的改变一下你的思路
    用for循环取随即数的确会遇到重复的地方,所以你要加上一个判断以下是代码,楼主自己测试一下var j:integer;
        temp:string;
        flag:boolean;//判断是否到10个
    begin
    jg.Clear;
    jg.Items.Add('以下是三等奖的获奖名单!(10个)');
    zhjg.Items.Add('以下是三等奖的获奖名单!(10个)');
    try
    flag:=false;
    while not flag do
    begin
     i:=adoquery2.RecordCount;
     randomize;
     adoquery1.Close;
     adoquery1.SQL.Clear;
     adoquery1.SQL.Add('select * from a where id=:id');
     adoquery1.Parameters.ParamValues['id']:=random(i);
     adoquery1.Open;
     temp:=adoquery1.FieldValues['a'];
     if temp in jg then //如果已经存在的号码
       Begin
         showmessage('已经有了');
         continue;//跳出本次循环
       End;
     jg.Items.Add(temp);
     zhjg.Items.Add(temp);
     if jg.count=10 then
       flag:=true;//已经有十个了 
     end;
    except
    end;
    end;
      

  3.   

    取空值是因为random的范围0-i,你取得多了1个
    重复问题麻烦一点,要么取到后删除该纪录,要么建临时表,对那个表进行操作。
      

  4.   

    先取出ID,再随机选出ID(同时处理重复问题),最后根据ID从数据库中读出具体信息。
    我就是这么做的,效果好着呢。
      

  5.   

    先取出所有ID,再随机选出中奖ID(同时处理重复问题),最后根据ID从数据库中读出具体信息。
    我就是这么做的,效果好着呢。
      

  6.   

    设置一个全局变量,SL: TStringList;
    方法同上。
      

  7.   

    老兄,下面是我特地为你写的,要给点分哦
    var
      Form1: TForm1;
      iRound  :integer = 0;
      iRoundMax :integer =4;//三等奖
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      i,iCount:integer;
      sEmp,sOperid,sRound:string;
      label summer;
    begin
      if iRound =iRoundMax then
      begin
        case iRoundMax of
          4:sRound := '三等奖';
          2:sRound := '二等奖';
          1:sRound := '一等奖';
        end;
        Application.MessageBox(pchar(sRound+'获奖者已经产生'),pchar('提示'),0);
        Exit;
      end;
      Adoquery1.Close;
      Adoquery1.Open;
      iCount := Adoquery1.RecordCount;
      summer:Randomize;
      Adoquery2.Close;
      Adoquery2.SQL.Clear;
      sOperId := inttostr(Random(iCount));
      if sOperId ='0' then
        goto summer
      else
      begin
        for i :=0 to (6-length(sOperId)-1) do
        begin
          sOperId := '0'+sOperId;
        end;
        Adoquery2.SQL.Add('select * from #aaa where IsWin=0 and operid='+sOperId);
        Adoquery2.Open;
        if Adoquery2.RecordCount =0  then
          goto summer;
        sEmp := Adoquery2.Fieldbyname('Name').AsString;
        Application.MessageBox(pchar('获奖者是:'+sEmp),pchar('提示'),0);
        Adoquery2.Edit;
        Adoquery2.FieldByName('IsWin').Value := '1';
        Adoquery2.Post;
        Memo1.Lines.Add(sEmp+#13#10);
        inc(iRound);
      end;
    end;procedure TForm1.FormActivate(Sender: TObject);
    begin
      Adoquery2.Close;
      Adoquery2.SQL.Clear;
      Adoquery2.SQL.Add('select Operid,Name into #aaa from Operinfo');
      Adoquery2.SQL.Add('alter table #aaa add IsWin bit null default 0 with values');
      Adoquery2.ExecSQL;
      Memo1.Clear;
      Memo1.Lines.Add('------------------------三等奖获得者名单---------------------');
    end;procedure TForm1.RadioButton1Click(Sender: TObject);
    begin
      iRoundMax := 4;
      iRound := 0;
      Memo1.Lines.Add('------------------------三等奖获得者名单---------------------');
    end;procedure TForm1.RadioButton2Click(Sender: TObject);
    begin
      iRoundMax := 2;
      iRound := 0;
      Memo1.Lines.Add('------------------------二等奖获得者名单---------------------');
    end;procedure TForm1.RadioButton3Click(Sender: TObject);
    begin
      iRoundMax := 1;
      iRound := 0;
      Memo1.Lines.Add('------------------------一等奖获得者名单---------------------');
    end;
      

  8.   

    我写的是3个级别的奖项,人数,4,2,1,数据库sqlserver,memo中显示了结果,你可以参考一下
      

  9.   

    对了,还有一点说明一下,我的operinfo表中没有id,只有operid也是唯一的,是6位char
      

  10.   

    select * from table1
    where id not in(select id from table2)
    order by newid()
      

  11.   

    建一个有ID号(唯一递增)的数据源。没有的话,可从原表的基础上建。然后产生十个随机ID数。select * from Table where id value in ('id0','id1',.....'id9')