我在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神奇的力量引起的,在程序实际调用之前查询每个过程的元数据。
有可能解决这个问题吗?
答案 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