使用Firedac运行SQL存储过程

时间:2015-03-12 07:56:52

标签: sql sql-server delphi pascal firedac

我正在尝试弄清楚如何使用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;

这是消息

  

---------------------------调试器异常通知

     

Project RefractiveIndexTests.exe引发异常类异常,消息为'对象工厂的类   {3E9B315B-F456-4175-A864-B2573C4A2201}缺失。要注册它,你   可以将组件[TFDGUIxWaitCursor]放入项目中。

我使用

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

来自测试项目。

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

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

1 个答案:

答案 0 :(得分:10)

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

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