delphi - FireDac 查询返回空结果
问题描述
让我们直奔主题。我正在以与我已经完成的完全相同的方式向 FireDac 进行查询。但是在这个时候,查询并没有带回任何东西。我已经对这个“问题”进行了很多搜索,我也已经调试了代码,一切似乎都正确,所以我现在需要帮助。
DMStockDAO:
function TStockDAO.GetProvidersByIdProduct(
idProduct: integer): TList<TProvider>;
var dao : TProviderDAO;
list : TList<TProvider>;
begin
dao := TProviderDAO.Create(Self);
list := TList<TProvider>.Create;
try
with queryProvidersByIdProduct do
begin
ParamByName('pIdProduct').AsInteger := idProduct;
Open;
while not Eof do
begin
list.Add(dao.FindProviderById(FieldByName('IDProvider').AsInteger));
Next;
end;
end;
Result := list;
finally
dao.Free;
end;
end;
查询中的 SQL:“SELECT IDProvider FROM Stock WHERE IDProduct = :pIdProduct”
这段代码需要返回一个提供者列表,但它什么也没给我。
DMProviderDAO:
function TProviderDAO.FindProviderById(id: Integer): TProvider;
var provider : TProvider;
begin
try
provider := TProvider.Create;
with queryFindProviderById do
begin
ParamByName('pId').AsInteger := id;
Open;
provider.Id := FieldByName('ID').AsInteger;
provider.ProviderName := FieldByName('ProviderName').AsString;
provider.City := FieldByName('City').AsString;
provider.Street := FieldByName('Street').AsString;
provider.Number := FieldByName('Number').AsInteger;
provider.CNPJ := FieldByName('CNPJ').AsString;
Result := provider;
end;
finally
provider.Free;
end;
end;
谢谢你们的帮助!!如果您需要更多代码,请直接说出来。
编辑:TProviderDAO 声明:
unit DMProviderDAO;
interface
uses
System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,
FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, Data.DB,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, UProvider;
type
TProviderDAO = class(TDataModule)
queryFindProviderById: TFDQuery;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function FindProviderById(id : Integer) : TProvider;
end;
var
ProviderDAO: TProviderDAO;
implementation
uses
DMConnection;
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TProviderDAO.DataModuleCreate(Sender: TObject);
begin
DMConnection.TConnection.Create(Self);
end;
TProvider 声明:
unit UProvider;
interface
uses System.Classes;
type
TProvider = class
private
FId : Integer;
FProviderName : string;
FCity : string;
FStreet : string;
FNumber : Integer;
FCNPJ: string;
procedure SetId(id : integer);
procedure SetProviderName(name : string);
procedure SetCity(city : string);
procedure SetStreet(street : string);
procedure SetNumber(number : Integer);
procedure SetCNPJ(cnpj : string);
public
property Id: integer read FId write SetId;
property ProviderName: string read FProviderName write SetProviderName;
property City: string read FCity write SetCity;
property Street: string read FStreet write SetStreet;
property Number: Integer read FNumber write SetNumber;
property CNPJ: string read FCNPJ write SetCNPJ;
end;
解决方案
你必须关闭();再次打开之前的查询。如果您在循环中进行查询,这是强制性的,如果不是,您不需要关闭它。
function TProviderDAO.FindProviderById(id: Integer): TProvider;
var provider : TProvider;
begin
try
provider := TProvider.Create;
with queryFindProviderById do
begin
Close();
ParamByName('pId').AsInteger := id;
Open;
provider.Id := FieldByName('ID').AsInteger;
provider.ProviderName := FieldByName('ProviderName').AsString;
provider.City := FieldByName('City').AsString;
provider.Street := FieldByName('Street').AsString;
provider.Number := FieldByName('Number').AsInteger;
provider.CNPJ := FieldByName('CNPJ').AsString;
Result := provider;
end;
finally
provider.Free;
end;
end;
推荐阅读
- google-sheets - 使用当前页面数据从另一个页面解析查询时出错
- mysql - 如何对 SQL 中的特定行和列求和?
- ios - Firebase 云消息传递无法在 iOS 12 上运行
- ejabberd - Ejabberd 无法在 MAC 上使用 [Failed to open socket at [::]:5222]
- tomcat - Tomcat 在 9.0.7 中不允许在 URL 中使用反斜杠
- csv - TSV:列表作为值的约定
- vba - Word 用户表单热键
- winmerge - Windows 10 上的 WinMerge:右键单击比较不起作用
- groovy - 如何在字符串中加入地图的键?
- tensorflow - 如何从顶部和底部拆分 resnet50 模型?