2

我的 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 子句时,查询什么也不返回!谁能建议我的代码有什么问题?

这是我表中数据的图像: 在此处输入图像描述

4

2 回答 2

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,但第二个不会。)

于 2013-05-17T17:39:56.783 回答
1

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

于 2013-05-17T22:22:59.420 回答