FireDac查询返回空结果

问题描述 投票:1回答:1

我们直接进入正题。我在用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"

这段代码需要返回一个List of provider,但它什么也没给我。

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;
delphi
1个回答
0
投票

你必须要 关闭()。 查询,然后再打开它。如果你是在循环中进行查询,这是必须的,如果不是,你不需要关闭它。

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;
© www.soinside.com 2019 - 2024. All rights reserved.