SQLite - TFDQuery with Delphi



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

一些上下文优先:

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

  • George 1(正确的名字(
  • 乔治1
  • Georg 1

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

为了提供更好的用户体验,我创建了一个本地SQLite表,可以与REST服务器同步。在发布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;

这给了我:

  • 如果SiteName字段存在100%匹配,则返回一个结果
  • 如果不是,则结果为零

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

我还试图通过删除号码来获得所有可能的"乔治"记录,但我总是得到零结果

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

我试着使用Query.RecordCount来知道我是否需要搜索更多,但它总是给我0

实现这一点的最佳Delphi代码是什么?

提前感谢您对的帮助

您必须使用这样的请求:

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

当使用Like时,在操作系统中搜索文件时,%*非常相似。当然,你可以用";或者";。

翻译成Delphi片段,它给出:

procedure TForm1.Button1Click(Sender: TObject);
begin
FDConnection1.DriverName                := 'SQLITE';
FDConnection1.Params.Values['Database'] := 'E:TempStackOverflow64067394.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;

最新更新