gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:37:43 25 4
gpt4 key购买 nike

我在 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(假设返回666)

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

这个问题能解决吗?

最佳答案

我将您对 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 default

在 Sql Server Management Studio 中正确返回

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时,到目前为止,我一直拒绝尝试设置接受“默认”并正确执行sp的参数类型。

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

关于delphi - FireDAC - 如何使用默认参数执行存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41824602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com