首页 > 解决方案 > 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;

标签: delphi

解决方案


你必须关闭();再次打开之前的查询。如果您在循环中进行查询,这是强制性的,如果不是,您不需要关闭它。

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;

推荐阅读