SQLite - TFDQuery Delphi
SQLite - TFDQuery with Delphi
我根本不是数据库专家。我需要你的帮助。
首先是一些上下文:
我需要 post 向 REST 服务器发送工单。
当我拿到 WO 时,我知道客户名称、必须执行作业的站点名称以及完整的站点地址。
我收到的网站名称可能是这样的:
- 乔治 1(正确的名字)
- 乔治1
- 格奥尔格 1
如果我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;
这给了我:
- 如果 SiteName 字段存在 100% 匹配,则一个结果
- 如果不是,结果为零
首先,我想改进该查询以获取包含 '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;
我根本不是数据库专家。我需要你的帮助。
首先是一些上下文:
我需要 post 向 REST 服务器发送工单。 当我拿到 WO 时,我知道客户名称、必须执行作业的站点名称以及完整的站点地址。 我收到的网站名称可能是这样的:
- 乔治 1(正确的名字)
- 乔治1
- 格奥尔格 1
如果我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;
这给了我:
- 如果 SiteName 字段存在 100% 匹配,则一个结果
- 如果不是,结果为零
首先,我想改进该查询以获取包含 '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;