Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在SQL中搜索数组_Delphi_Delphi Xe2 - Fatal编程技术网

Delphi 如何在SQL中搜索数组

Delphi 如何在SQL中搜索数组,delphi,delphi-xe2,Delphi,Delphi Xe2,我有4种法力类型:熔岩、水、黑暗和自然。我想对每一个进行查询,一次一个。目前我有 procedure TFGame.GetStartingCards; var ManaType :string ; begin Manatype := 'Nothing'; while ManaType <> 'Nature' do begin if ManaType = 'Dark' then ManaType := 'Nat

我有4种法力类型:熔岩、水、黑暗和自然。我想对每一个进行查询,一次一个。目前我有

    procedure TFGame.GetStartingCards;
var
   ManaType :string  ;
begin
Manatype := 'Nothing';
    while ManaType <> 'Nature' do
      begin
        if ManaType = 'Dark' then
            ManaType := 'Nature';
        if ManaType = 'Water' then
            ManaType := 'Dark';
        if Manatype = 'Lava' then
            Manatype := 'Water';
        if Manatype = 'Nothing' then
           ManaType := 'Lava' ;
        with adoquery1 do
          begin
             close;
             sql.Clear;
             sql.Add('SELECT * ');
             sql.Add('FROM Cards');
             sql.Add('WHERE Color='''+ManaType+'''');
             open;
          end;

          //return the result of everything for giving mana type..
    end;
程序TFGame.GetStartingCards;
变量
类型:字符串;
开始
Manatype:=“无”;
而“自然”类型的
开始
如果ManaType='Dark',则
ManaType:=‘自然’;
如果ManaType=水,则
ManaType:=“黑暗”;
如果Manatype='Lava',则
Manatype:=“水”;
如果Manatype=‘Nothing’,则
ManaType:=“熔岩”;
用adoquery1做
开始
关
sql.Clear;
sql.Add('SELECT*');
sql.Add('FROM Cards');
Add('WHERE Color=''+ManaType+'');
打开
终止
//返回给予法力类型的所有结果。。
终止

但这似乎是一种更好的方法,比如将每种法力类型放入一个数组中,并使用该数组为查询提供信息。但无法让它工作。所以问题是,如果我决定保持这种状态,它会有任何缺陷吗?

我建议为mana引入一个枚举类型,可能还有一个用于查询的字符串常量数组

type 
  TManaType = (mtNothing, mtNature, mtDark, mtWater, mtLava);

const
  cManaQueryNames : array[mtNothing..mtLaval] of string =
    ('nothing','nature','dark','water','lava');

此外,在你的数据库中,你可以考虑将MaType作为一个数字,与TMANTYPE的数值(ORD)相关联,这样在你的数据库中,水法力应该被存储为ORD(MTWATER)=3</P>< P>你可以使用一个SQL查询来获得你的法力类型的所有结果:

SELECT * FROM cards WHERE Color IN ('Dark', 'Nature', 'Water', 'Lava')
或者在数组和循环中弹出类型:

for manaType in manaTypes do
begin 
// run an SQL query
end;

阵列是更好的方法,因为您现在可以从其他地方(数据库、配置文件)获取法力类型,并且它们在您的源代码中没有硬编码。这会更好,因为你可能会改变你对他们的名字或号码的想法,如果在这种情况下你不必修改和重新编译你的程序,那会更有效率。

这是一个比我更好的答案。也许可以考虑解释他为什么要做这些事情,以及他们在程序中添加了什么,最好是使用枚举,因为它在Delphi中被当作一个数字类型。这些字符串的比较速度至少更快,在这种情况下,它们占用的内存空间也比这里使用的最短字符串少。最好将这些值存储在数字类型字段中到数据库中,因为同样,您可以节省一些空间,条件查询的比较也会更快。而且从数据库中的一系列类型中选择卡片也会更容易。通过此操作,我可以得到“')预期的“,”找到的“。。。在'in'Lava'之后,ManaTypes:string=('Nothing','Lava','Water','Dark','Nature')的数组[0..4];对于工作代码的评论,请尝试。除了Rob所说的,请将您的问题标题编辑为对搜索中的未来读者有用的内容。“这有什么缺陷吗?”在这里作为搜索词是毫无价值的。:-)
procedure TFGame.GetStartingCards;
const
  ManaTypes : array [0..4] of string = ('Nothing', 'Lava', 'Water', 'Dark', 'Nature');
var
   i: integer;
begin
  for i := 0 to Length(ManaTypes) - 1 do
  begin
    with adoquery1 do
    begin
      close;
      sql.Clear;
      sql.Add('SELECT * ');
      sql.Add('FROM Cards');
      sql.Add('WHERE Color='''+ManaTypes[i]+'''');
      open;
    end;

      //return the result of everything for giving mana type..
  end;
end;