FireDAC - 如何使用默认参数执行存储过程?

FireDAC - How to execute Stored procedure with default parameters?

我在 MS SQL 服务器上创建了以下存储过程

CREATE PROCEDURE sppl_ParamTest
 @ID int = 666
AS
 BEGIN
  SELECT @ID;
 END

并尝试使用 FireDAC 调用它(不创建任何参数):

FCommand:TFDCommand;
...
FCommand.Params.Clear;
FCommand.SQL.Text:='sppl_ParamTest';
FCommand.CommandKind:=skStoredProc
if FCommand.Params.Count=0 then
FCommand.Open;

但是存储过程returns NULL(假设为return 666)

据我了解,这是由 FireDAC 神奇的力量造成的,在过程实际调用之前查询每个过程元数据。

是否可以解决这个问题?

我将您对 sppl_ParamTest 的定义添加到我的 Sql Server 2014 中,并在对 FDConnection 进行最小配置以将其指向服务器和数据库后执行以下代码。 FDQuery 是组件面板中的新鲜内容,仅设置了连接 属性。

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDQuery1.SQL.Text := 'sppl_ParamTest';
  FDQuery1.Open;
  Caption := FDQuery1.Fields[0].AsString;
end;

表单的标题按预期显示 666

部分数据流管理(省略用户名和密码):

  object FDConnection1: TFDConnection
    Params.Strings = (
      'Database=MATest'
      'Server=MAT410\ss2014'
      'DriverID=MSSQL')
    LoginPrompt = False
    Left = 32
    Top = 16
  end
  object FDQuery1: TFDQuery
    Connection = FDConnection1
    Left = 104
    Top = 16
  end

Update 我认为 OP 的问题很可能是由于 TFDCommand 和 TFDStoredProc 的实现中存在缺陷而引起的。正在执行

sppl_ParamTest default

在 Sql Server Management Studio 中正确 returns

666

sppl_ParamTest default(或只是 sppl_ParamTest)作为其命令文本打开 FDQuery 也是如此。

但是,如果将 TFDCommand 的 CommandText 设置为相同的值,对其调用 Execute 会产生此错误

Could not find Stored Procedure 'MATest.dbo.sspl_ParamTest default'

同样地,

FDStoredProc1.ParamByName('@ID').Value := 'default';

(毫不奇怪)引发错误

Could not convert variant of type (String) into type (Integer)

关于调用 FDStoredProc.Open 并且到目前为止一直拒绝我设置接受 'default' 并正确执行 sp.

的参数类型的尝试

此外,尝试使用 EmptyParam 作为输入参数值调用 FDCommand 失败 return 666 值。

将此选项设置为

FetchOptions.Items:=[]

FetchOptions.Items := FetchOptions.Items - [fiMeta]

将阻止 FireDac 查询元数据,并允许使用参数默认值。

感谢 whosrdaddy