【发布时间】:2017-11-08 15:27:29
【问题描述】:
我正在使用 Delphi 7 和 SQL Server 2008。我创建了一个虚拟表和虚拟存储过程,如下所示。
CREATE TABLE [dbo].[Persons]
(
[P_ID] [int] IDENTITY(1,1) NOT NULL,
[LastName] [varchar](255) NOT NULL
)
CREATE PROCEDURE [dbo].[p_dummy_proc]
@p_id int,
@p_name VARCHAR(10) = 'dummy' -- donot pass anything from delphi and it should take 'dummy'
AS
BEGIN
IF (@p_name is null)
RAISERROR 123456 'why are you null'
ELSE
INSERT INTO dbo.persons(LastName)
VALUES(@p_name)
END
我从 Delphi 调用上述过程是这样的:
procedure TForm1.Button1Click(Sender: TObject);
begin
try
ADOStoredProc1.Parameters.ParamByName('@p_id').Value := 10;
ADOStoredProc1.ExecProc; // error why are you null
except
on E: EDatabaseError do
ShowMessage(e.Message);
end;
end;
在 Delphi 代码中,我没有传递第二个参数,我希望 SQL Server 应该采用它的默认值。
当我执行存储过程时,我得到了一个错误。为什么当我没有从 Delphi 传递任何东西时,SQL Server 不采用默认值?
【问题讨论】:
-
你得到的确切错误是什么?
-
@kirchner :更新了错误的问题。错误是“你为什么为空”。
-
@nil :: 我没有看到参数的任何绑定属性。
-
好的,所以 SQL Server 正在接收一个明确的 NULL。为了应用默认值,您不能为参数传递任何内容,甚至不能传递 NULL。当您没有为代码中的参数提供值时,基础设施可能会传递 NULL 默认值?您可以尝试从参数列表中删除 @p_name 吗?
-
如果我在设计时添加参数,我只能重现您描述的行为。如果我在设计时不这样做并在分配参数值之前在执行时调用
Parameters.Refresh,则它可以正常工作 - 没有错误并且在分析器中调用会显示默认关键字。
标签: sql-server delphi delphi-7 ado