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

时间:2017-01-24 09:33:01

标签: delphi stored-procedures firedac default-parameters

我在MS SQL Server上创建了以下存储过程

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;

但是存储过程返回NULL(supose返回666)

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

有可能解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

我将sppl_ParamTest的定义添加到我的Sql Server 2014中,并在最小配置FDConnection后执行以下代码,将其指向服务器&数据库就可以了。 FDQuery是组件面板中的新鲜事物,只设置了Connection属性。

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

表单的标题按预期显示666

部分DFM(省略用户名和密码):

  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

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

  

sppl_ParamTest默认

在Sql Server Management Studio中正确返回

  

666

使用sppl_ParamTest default(或仅sppl_ParamTest)作为命令文本打开FDQuery也是如此。

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

  

无法找到存储过程'MATest.dbo.sspl_ParamTest默认'

同样,做

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

(不出所料)引发错误

  

无法将type(String)的变体转换为type(Integer)

关于调用FDStoredProc.Open并且迄今为止拒绝了我设置参数类型的尝试,该参数类型将接受'default'并正确执行sp。

此外,尝试使用EmptyParam作为输入参数值调用FDCommand时,无法返回666值。

答案 1 :(得分:2)

将此选项设置为

fixed_btn

FetchOptions.Items:=[]

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

感谢whosrdaddy