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
我在 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