Delphi 如何使adoquery排序正确工作

Delphi 如何使adoquery排序正确工作,delphi,delphi-xe2,Delphi,Delphi Xe2,我只有一个问题,当我尝试 adoquery1.sort:=“成本” 它不会对查询中的项目进行排序 {Gets starting cards and put them into the correct rows} //*************************************************************************** procedure TFGame.GetStartingCards; //*****************************

我只有一个问题,当我尝试 adoquery1.sort:=“成本”

它不会对查询中的项目进行排序

{Gets starting cards and put them into the correct rows}
//***************************************************************************
procedure TFGame.GetStartingCards;
//***************************************************************************
const
  ManaTypes : array [0..3] of string = ('Lava','Water','Dark','Nature');
var
   i: integer;
   z:integer;
   Cards: TObjectList<Tcard>;
begin
  Cards := TObjectList<TCard>.Create(false);
  z:=0;
  {add all tcards (Desgin ) to this list in order Lava,water,dark,nature }
  cards.Add(cardLava1);
  cards.Add(cardlava2);
  cards.Add(cardlava3);


  for i := 0 to Length(ManaTypes) - 1 do
  begin
    with adoquery1 do
    begin
      close;
      sql.Clear;
      sql.Add('SELECT TOP 4 * FROM Cards WHERE Color = "'+ManaTypes[i]+'" ORDER BY Rnd(-(1000*ID)*Time())');
      open;
    end;

      {return the result of everything for giving mana type.. }
     if adoquery1.RecordCount = 0 then
        Showmessage('Error no cards in db');
     adoquery1.Sort := 'Cost';
     adoquery1.First;

     while not adoquery1.Eof do
     begin
        cards[z].Ccost := adoquery1.Fieldbyname('Cost').AsInteger;
    //based on color change background
        cards[z].Background.LoadFromFile(format('%s\pics\%s.png',[maindir,cards[z].Ccolor]));
       adoquery1.Next;
       cards[z].repaint;
       z:=z+1;
     end;
  end;
 cards.Free;
end;

如果将CursorLocation设置为ClusClient,则Adoquery.Sort应该可以工作。 另一种选择是将查询更改为:

Select * from
(
SELECT TOP 4 * FROM Cards WHERE Color = "'+ManaTypes[i]+'" ORDER BY Rnd(-(1000*ID)*Time())
) x
ORDER by Cost
它将随机选择4行,并按成本对其排序

编辑 作为@kobik评论的后续行动: 如果您已经在使用ClusClient,并且您的排序似乎不起作用,那么您必须确保排序可以按照您的意图进行解释。如果您使用的是WideTringField,它将被排序为任意字符串10,8,9。您可以将字段类型更改为int或float,也可以向查询中添加一个强制转换字段以进行排序CintTextField作为IntForSort,CDBLTextfield作为FloatForSort进行访问。
由于如果无法强制转换字段内容,这可能会导致转换错误,因此我建议在表的设计中使用预期的字段类型。

我猜您正在使用Access with cursorlocation clUseServer,如果是,请更改为clUseClient。adoquery1在哪里。while循环中的下一个?这段代码有效吗?你怎么知道它没有对查询中的项目进行排序?很抱歉,有一个adoquery1。接下来,我删除了一些重复的代码,它一定在那里。。我知道它是有效的,因为我可以看到显示的数字。@Glen,请发布实际有效的代码。您遗漏的重复代码可能存在问题。被接受的答案是一个很好的选择,但仍然不能解释为什么adoquery1.Sort不适合你。此外,当您在评论中称呼某人时,请使用@user@kobik添加了意外删除的代码。假设您正在使用Access:SELECT*,则从卡中将CINTCost作为CostAsInt;对不起,bummi,我注意到我把它读成了一个数字。所以我把它换成了db:D中的一个数字。再次感谢!