SQLite - TFDQuery Delphi

SQLite - TFDQuery with Delphi

我根本不是数据库专家。我需要你的帮助。

首先是一些上下文:

我需要 post 向 REST 服务器发送工单。 当我拿到 WO 时,我知道客户名称、必须执行作业的站点名称以及完整的站点地址。 我收到的网站名称可能是这样的:

如果我post将 WO 发送到服务器,请求有时会被拒绝,因为站点名称与服务器上存储的名称并非 100% 完全相同。

为了提供更好的用户体验,我创建了一个可以与 REST 服务器同步的本地 SQLite table。在 post 提交 WO 之前,如果未找到直接匹配项,我想通过提出最佳匹配项的下拉列表,让用户有机会更正网站名称。

此时,我的代码是:(这可能不是最好的方法)

Query := TFDQuery.Create(nil);
try
  Query.Connection := DBConnection;
  SQL:= 'Select Sitename from SitesTable where (CUSTOMERNAME = :CustomerName) AND (Sitename LIKE :SiteName)';
  Query.SQL.Text := SQL;
  Query.ParamByName('CustomerName').AsString := aCustomerName;
  Query.ParamByName('SiteName').AsString := aSiteNam;
  Query.Open;

  while not Query.Eof do
    begin
      List.Add(Query.FieldByname('Sitename').AsString);
      Query.Next;
  end;
finally
  Query.Free;
end;

这给了我:

首先,我想改进该查询以获取包含 'George 1' 的所有可能站点,包括 George 15。这就是为什么我使用 LIKE 而不是 =,但它只给了我一个结果。

我也试图通过删除数字来获取所有可能的 'George' 记录,但我总是得到零结果

最后,如果没有找到匹配项,我想查询地址字段以建议位于该街道的所有站点。

我尝试使用 Query.RecordCount 来了解是否需要搜索更多,但它总是给我 0

实现此目的的最佳 Delphi 代码是什么?

提前感谢您的帮助

您必须使用这样的请求:

Select Sitename 
from SitesTable
where (Sitename = "George 1") 
   or (Sitename like "%George%");

当使用 Like 时,%* 在 OS 中搜索文件时非常相似。 当然,您可以使用“或”添加尽可能多的变体。

翻译成 Delphi 片段,它给出:

procedure TForm1.Button1Click(Sender: TObject);
begin
    FDConnection1.DriverName                := 'SQLITE';
    FDConnection1.Params.Values['Database'] := 'E:\Temp\Whosebug64067394.sqlite3';
    FDConnection1.Open;

    FDQuery1.SQL.Text := 'Select Sitename ' +
                         'from SitesTable ' +
                         'where (Sitename = :Param1) ' +
                            'or (Sitename like :Param2)';
    FDQuery1.ParamByName('Param1').AsString := 'George 1';
    FDQuery1.ParamByName('Param2').AsString := '%George%';
    FDQuery1.Open;
    while not FDQuery1.Eof do begin
        Memo1.Lines.Add(FDQuery1.FieldByName('Sitename').AsString);
        FDQuery1.Next;
    end;
    FDQuery1.Close;
end;