当我添加WHERE子句时,为什么我的查询不返回任何结果?

时间:2013-05-17 17:05:45

标签: database sqlite delphi

我的Delphi应用程序已成功连接到SQLite。

procedure TForm1.Button1Click(Sender: TObject);
begin
  ZQuery1.Close;
  ZQuery1.SQL.Clear;
  ZQuery1.SQL.Text := 'SELECT Name FROM city;';
  ZQuery1.Open;

  while not ZQuery1.EOF do
  begin
    Memo1.Lines.Add(ZQuery1.FieldValues['name']);
    ZQuery1.Next;
  end;
end;

上面的代码工作正常,并从表格城市加载字段名称的内容。 然而,

procedure TForm1.Button1Click(Sender: TObject);
begin
  ZQuery1.Close;
  ZQuery1.SQL.Clear;
  ZQuery1.SQL.Text := 'Select name from city WHERE district = :aField';
  ZQuery1.Params.ParamByName('aField').Value := 'kabol';
  ZQuery1.Open;

  while not ZQuery1.EOF do
  begin
    Memo1.Lines.Add(ZQuery1.FieldValues['name']);
    ZQuery1.Next;
  end;
end;

令人惊讶的是,当我添加一个where子句时,查询什么都不返回!任何人都可以建议我的代码有什么问题吗?

这是我表中数据的图像: enter image description here

2 个答案:

答案 0 :(得分:4)

您可能没有district kabol的任何数据。添加WHERE子句将导致不返回任何行,这意味着ZQuery1.Eof立即为真,并且永远不会输入您的while not ZQuery1.Eof do循环。

您可以通过将第一个查询(有效的查询)更改为以下内容来检查:

ZQuery1.SQL.Text := 'SELECT Name, District FROM City';

然后将输出更改为

Memo1.Lines.Add(ZQuery1.FieldValues['name'] + #9 +
                ZQuery1.FieldValues['district']);

如果在最右边的列中没有在备忘录中看到包含kabol的至少一行,则表示您没有符合WHERE条件的行。 (请注意,大多数数据库都区分大小写,因此kabol不等于Kabol;第一个数据库与WHERE匹配,但第二个数据库不匹配。)

答案 1 :(得分:1)

您的屏幕截图显示district'Kabol'(大写K)的一个数据库行,但您的SQL查询正在查找'kabol'(小写k)。假设查询以区分大小写的方式比较strins,这可以解释为什么没有找到行。因此,要么在查询输入中修复大小写,要么改为执行不区分大小写的查询。