SQL找不到结果

时间:2014-01-26 01:02:01

标签: sql delphi ms-access

此查询当前没有返回任何结果,它应该。你能看到这个查询有什么问题吗

字段标题为NEED_2_TARGET,ID和CARD

NEED_2_TARGET =整数

CARD = string

ID =整数

名称的值是'Ash Imp'

{this will check if a second target is needed}
//**************************************************************************
function TFGame.checkIf2ndTargetIsNeeded(name: string):integer;
//**************************************************************************
var
  targetType : integer; //1 is TCard , 2 is TMana , 0 is no second target needed.
begin
    TargetType := 0;
    Result := targetType;
       with adoquery2 do
        begin
          close;
          sql.Clear;
          sql.Add('SELECT * FROM Spells WHERE CARD = '''+name+''' and NEED_2_TARGET = 1');
          open;
        end;

        if adoquery2.RecordCount < 1 then
          Result := 0
       else
         begin
           Adoquery2.First;
           TargetType := adoquery2.FieldByName(FIELD_TARGET_TYPE).AsInteger;
           result := TargetType;
         end;

end;

sql db如下所示

ID  CARD    TRIGGER_NUMBER  CATEGORY_NUMBER QUANTITY    TARGET_NUMBER   TYPE_NUMBER PLUS_NUMBER PERCENT STAT_TARGET_NUMBER  REPLACEMENT_CARD_NUMBER MAX_RANDOM  LIFE_TO_ADD REPLACED_DAMAGE NEED_2_TARGET   TYPE_OF_TARGET
27  Ash Imp     2                   2          15             14                                                                                                                                  1             1

3 个答案:

答案 0 :(得分:3)

有很多事情可能会出错。

在您的故障排除中,首先也是最重要的是接受您的查询并直接针对您的数据库运行它。即首先通过消除其他错误的可能性来确认您的查询是正确的。更多的事情证实了工作,更少的“噪音”分散你的注意力来解决问题。

  1. 正如其他人指出的那样,如果你没有清除你的SQL语句,你可能会在第一个结果集中返回零行。
    • 是的,我知道,您已经评论过 正在清除您之前的查询。关键是:如果您在解决问题时遇到问题,那么您如何 确定 问题所在?因此,不要遗漏潜在的相关信息
  2. 这给我们带来了第二种可能性。我无法看到您的其余代码,因此我不得不问:更改查询后您是否刷新了数据?如果您没有CloseOpen您的查询,您可能正在查看先前执行的结果集。
    • 我不确定您是否允许在组件Active时更改查询文本,甚至是否依赖于您正在使用的数据访问组件。关键是,值得检查。
  3. 您的应用程序是否连接到正确的数据库?由于您使用的是Access,因此很容易连接到不同的数据库文件而无法实现。
    • 您可以通过更改查询来返回所有行(即删除WHERE子句)来检查这一点。
  4. 您想要更改SQL查询中使用的引号。而不是:...CARD = "'+name+'" ORDER...而是使用...CARD = '''+name+''' ORDER...
    • 据我所知,单引号是ANSI标准。即使某些数据库允许双引号,使用它们也会限制可移植性,并且在通过某些数据访问驱动程序时可能会产生意外结果。
  5. 检查CARD列的数据类型。如果它是固定长度的字符串,则将填充数据值。例如。如果CARDchar(10),那么您实际上可能需要查找'Ash Imp '
    • 同样,实际值可能包含单词之前/之后的空格。使用select without WHERE并检查列的实际值。您还可以检查SELECT * FROM Spells WHERE CARD LIKE '%Ash Imp%'是否有效。
  6. 最后,正如其他人所建议的那样,您最好使用参数化查询,而不是自己动态构建查询。

    • 您的代码将更具可读性和灵活性。
    • 您可以强制键入代码;因此,请避免将数字和日期等内容转换为字符串。
    • 您无需担心日期格式的特殊性。
    • 您消除了一些安全问题。

答案 1 :(得分:2)

  

@GordonLinoff db中的所有字段都是大写

如果确实如此,那就是你的问题。 SQL通常会对字符/字符串值进行区分大小写的比较,除非您告诉它不要这样做,例如使用STRCMP()(MySQL 4 +),LOWER()UPPER()(SQLServer,Firebird)等等。我也会把括号中的条件包括在内:

sql.Text := 'SELECT * FROM Spells WHERE (NEED_2_TARGET = 1) AND (STRCMP(CARD, "'+name+'") = 0) ORDER by ID';

sql.Text := 'SELECT * FROM Spells WHERE (NEED_2_TARGET = 1) AND (LOWER(CARD) = "'+LowerCase(name)+'") ORDER by ID';

sql.Text := 'SELECT * FROM Spells WHERE (NEED_2_TARGET = 1) AND (UPPER(CARD) = "'+UpperCase(name)+'") ORDER by ID';

答案 2 :(得分:1)

这是

的问题
With Adoquery2 do
begin
...
end

在sql中使用name时,它真的得到adoquery2.name而不是var名称。我通过将name更改为Cname来解决此问题。之后没有更多问题。