使用 Firedac 到 运行 SQL 存储过程

Using Firedac to run SQL stored procedure

我正在尝试弄清楚如何使用 firedac运行 存储过程

unit DataLayer.OilCommanderConnection;

interface

uses
  FireDAC.Phys.FB,
  Generics.Collections,
  Model.Sample,
  Model.Batch,

  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error,
  FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
  FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.MySQL, Data.DB,
  FireDAC.Comp.Client, FireDAC.Phys.MSSQL,
  FireDAC.DApt,
  FireDAC.Comp.UI
  ;

type
  TOilCommanderConnection = class
    strict private
    public
      Connection : TFDConnection;

      function GetSampleTypesForBatch(Batch : TBatch) : Boolean;  

      function Connect:Boolean;
      constructor Create;
      destructor Destroy; override;
  end;

implementation

uses
  SysUtils
  ;

function TOilCommanderConnection.Connect:Boolean;
var
    OK : Boolean;
begin
    OK := true;
    Connection := TFDConnection.Create(nil);
    try
        Connection.Params.LoadFromFile('MSSQL.ini');
    finally
        Result := OK;
    end;
end;

function TOilCommanderConnection.GetSampleTypesForBatch(Batch : TBatch) : Boolean;
var
    StoredProc : TFDStoredProc;
begin
    Connect;

    StoredProc := TFDStoredProc.Create(nil);
    try
        StoredProc.Connection := Connection;
        StoredProc.StoredProcName := 'GetSampleTypesForBatch';
        StoredProc.Prepare;

        StoredProc.FetchOptions.Items := StoredProc.FetchOptions.Items - [fiMeta];
        with StoredProc.Params do
        begin
            Clear;
            with Add do
            begin
                Name := 'BatchNo';
                ParamType := ptInput;
                DataType := ftString;
                Size := 6;
            end;            
        end;

        StoredProc.StoredProcName := 'GetSampleTypesForBatch';
        StoredProc.Prepare;
        StoredProc.Params[0].Value := Batch.RackNo;
        StoredProc.ExecProc;

        while not StoredProc.Eof do
        begin
            //StoredProc.FieldByName('').AsS
            StoredProc.Next;
        end;

    finally
        FreeAndNil(StoredProc);
    end;

    Result := true;
end;

constructor TOilCommanderConnection.Create;
begin
    inherited;
    Connection := TFDConnection.Create(nil);
end;

destructor TOilCommanderConnection.Destroy;
begin
    if Assigned(Connection) then FreeAndNil(Connection);

    inherited;
end;


end.

我在行

的第一次出现时收到一条错误消息

StoredProc.Prepare;

这是消息

--------------------------- Debugger Exception Notification

Project RefractiveIndexTests.exe raised exception class Exception with message 'Object factory for class {3E9B315B-F456-4175-A864-B2573C4A2201} is missing. To register it, you can drop component [TFDGUIxWaitCursor] into your project'.

我使用

调用了该函数
OilCommanderConnection.GetSampleTypesForBatch(batch);

来自测试项目。

我读到的 tutorial 没有解释如何处理这种情况。

我已经按照错误消息的提示尝试将 TFDGUIxWaitCursor 添加到我的项目中,但这没有任何区别。我想知道这个问题是否与我将数据库连接逻辑保存在我的主窗体的单独单元中有关。我希望能够将我的用户界面与我的数据层分开。

根据您的应用程序类型,将以下单元之一包含到任何一个 "uses" 子句中:

  • FireDAC.VCLUI.Wait - 对于 VCL 应用;
  • FireDAC.FMXUI.Wait - 对于 FireMonkey 应用程序;
  • FireDAC.ConsoleUI.Wait - 用于控制台/非可视化应用程序。