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

Delphi FireDAC-如何使用默认参数执行存储过程?,delphi,stored-procedures,firedac,default-parameters,Delphi,Stored Procedures,Firedac,Default Parameters,我在MS SQL Server上创建了以下存储过程 CREATE PROCEDURE sppl_ParamTest @ID int = 666 AS BEGIN SELECT @ID; END 并尝试使用FireDAC调用它(不创建任何参数): 但存储过程返回NULL(supose返回666) 据我所知,这是由FireDAC在过程实际调用之前查询每个过程元数据的魔力造成的 有可能解决这个问题吗?我在我的Sql Server 2014中添加了您对sppl_ParamTest的定义,并在

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

CREATE PROCEDURE sppl_ParamTest
 @ID int = 666
AS
 BEGIN
  SELECT @ID;
 END
并尝试使用FireDAC调用它(不创建任何参数):

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

据我所知,这是由FireDAC在过程实际调用之前查询每个过程元数据的魔力造成的


有可能解决这个问题吗?

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

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDQuery1.SQL.Text := 'sppl_ParamTest';
  FDQuery1.Open;
  Caption := FDQuery1.Fields[0].AsString;
end;
表单标题按预期显示
666

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

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

sppl_参数测试默认值

在SQLServerManagementStudio中正确返回

666

打开带有
sppl_ParamTest default
(或仅
sppl_ParamTest
)作为命令文本的FDQuery也是如此

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

找不到存储过程“MATest.dbo.sspl\u ParamTest default”

同样地,做

FDStoredProc1.ParamByName('@ID').Value := 'default';
(毫不奇怪)引发了错误

无法将类型(字符串)的变量转换为类型(整数)

调用FDStoredProc.Open时,我拒绝了我设置参数类型的尝试,该参数类型将接受“默认值”并正确执行sp


此外,当输入参数值无法返回666值时,尝试使用
EmptyParam
调用fd命令。

将此选项设置为

FetchOptions.Items:=[]

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


感谢whosrdaddy

您使用query来执行存储过程。不是命令。FDCommand用于填充内存数据集。您的问题是“有可能解决此问题吗?”我的回答是“是的,使用FDQuery,问题不会首先出现。”我无法使用查询填充内存数据集。您的解决方案类似于将文本更改为“exec sspl_parametest”。您没有提到内存中的数据集,但无论如何,您肯定可以从fdquery填充它们。Iirc,您只需将其中一个的数据属性分配给另一个。Valery,查询可以在没有SQL注入危险的情况下执行,您只需像在存储过程中那样定义其参数(而不是直接在SQL.Text上关联值)。或者在这种情况下根本没有参数,所以它永远不会注入恶意代码。是的,存储过程也被设计为在SQL语句上调用,正如MS文档中的示例所示,如果您在fetchoptions中打开meta标志,您可以自己指定参数,这在“谢谢,它起作用了”中有描述。请您解释一下:哪个组件,用于解决问题的FDCommand或FDStoreProc、如何使其“使用参数默认值”以及如何访问调用结果以获得值666?您可以使用任何FDCommand或FDStoredProc。FDStoredProc.ProceudreName:=“sppl_参数测试”;FDStoredProc.FetchOptions.Items:=[];FDStoredProc.Open;ShowMessage(FDStoredProc.Fields[0].AsString)//666
FDStoredProc1.ParamByName('@ID').Value := 'default';
FetchOptions.Items:=[]
FetchOptions.Items := FetchOptions.Items - [fiMeta]