我在delphi / sql server上遇到了一个小问题。我有一个SP
GO
/****** Object: StoredProcedure [dbo].[sp_adaugaUser] Script Date: 6/30/2014 12:33:52 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[sp_adaugaUser]
-- Add the parameters for the stored procedure here
@User varchar(50),
@Password varchar(32)--,
-- @errMesaj varchar(50)
AS
BEGIN
declare @sUser varchar(50),
@sPassword varchar(32),
@errMesaj varchar(100),
@exists bit,
@exists2 bit;
set @sUser = LTRIM(RTRIM(@User))
set @sPassword = LTRIM(RTRIM(@Password))
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select @exists = COUNT(*) from sys.server_principals where name = @sUser
select @exists2 = COUNT(*) from sys.database_principals where name = @sUser
-- Insert statements for procedure here
if @exists = 1 begin
if @exists2 = 1 set @errMesaj = 1 --'Userul deja exista'
else begin
exec ('CREATE USER [' + @sUser + '] FOR LOGIN [' + @sUser + ']')
set @errMesaj = 2 --'S-a creat userul pentru login deja existent'
end
end
else begin
exec(' CREATE LOGIN [' + @sUser + '] WITH PASSWORD = ''' +@sPassword + '''
CREATE USER [' + @sUser + '] FOR LOGIN [' + @sUser+']')
set @errMesaj = 3 --'S-a creat user si login'
end
RETURN @errMesaj
END
此SP将登录名和用户添加到服务器/数据库中...并根据其执行的操作返回消息。
在delphi中,我有一个有3个参数的TADOStoredProcedure:
1:@User - ftString,pdInput 2:@Password - ftString,pdInput 1:@errMesaj - ftString,pdReturnValue
我像这样调用TADOStoredProcedure:
procedure TdataModule1.AdaugaUser(user, password : string ); // procedura ce apeleaza o SP din BD pentru adaugarea de useri
begin
sp_adaugaUser.Parameters.ParamByName('@User').Value := user;
sp_adaugaUser.Parameters.ParamByName('@Password').Value := password;
sp_adaugaUser.Prepared := true ;
try
sp_adaugaUser.ExecProc;
finally
sp_adaugaUser.Prepared := false ;
sp_vizualizare_useri.Close;
sp_vizualizare_useri.Open;
test := sp_adaugaUser.Parameters.ParamByName('@errMesaj').Value;
end;
end;
但由于某种原因,当我调试test的值总是null
时,为什么?
错误:
答案 0 :(得分:5)
如果你想使用参数@errMesaj,你必须用OUTPUT来定义它。
ALTER PROCEDURE [dbo].[sp_adaugaUser]
-- Add the parameters for the stored procedure here
@User varchar(50),
@Password varchar(32),
@errMesaj varchar(100) OUTPUT
AS
SQLServer过程的RESULT值限制为整数Return Data from a Stored Procedure
显示不同可能性的示例可能如下所示:
Alter PROCEDURE [dbo].[sp_adaugaUser]
-- Add the parameters for the stored procedure here
@User varchar(50),
@Password varchar(32),
@errMesaj varchar(100) OUTPUT
AS
BEGIN
declare @sUser varchar(50),
@sPassword varchar(32),
@ReturnCode int,
@exists bit,
@exists2 bit;
set @sUser = LTRIM(RTRIM(@User))
set @sPassword = LTRIM(RTRIM(@Password))
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select @exists = COUNT(*) from sys.server_principals where name = @sUser
select @exists2 = COUNT(*) from sys.database_principals where name = @sUser
-- Insert statements for procedure here
if @exists = 1 begin
if @exists2 = 1
begin
set @errMesaj = 'Userul deja exista'
set @ReturnCode = 1
end
else begin
exec ('CREATE USER [' + @sUser + '] FOR LOGIN [' + @sUser + ']')
set @errMesaj = 'S-a creat userul pentru login deja existent'
set @ReturnCode = 2
end
end
else begin
exec(' CREATE LOGIN [' + @sUser + '] WITH PASSWORD = ''' +@sPassword + '''
CREATE USER [' + @sUser + '] FOR LOGIN [' + @sUser+']')
set @errMesaj = 'S-a creat user si login'
set @ReturnCode = 2
end
Return @ReturnCode
END
呼叫的最小delphi代码
sp_adaugaUser.Parameters.ParamByName('@User').Value := user;
sp_adaugaUser.Parameters.ParamByName('@Password').Value := password;
sp_adaugaUser.ExecProc;
Showmessage(sp_adaugaUser.Parameters.ParamByName('@errMesaj').Value);
Showmessage(IntToStr(sp_adaugaUser.Parameters.ParamByName('@RETURN_VALUE').Value));
对sp_adaugaUser使用TAdoStoredProc,您的参数应如下所示
你得到的错误是因为
test := sp_adaugaUser.Parameters.ParamByName('@errMesaj').Value;
值为NULL,无法转换为字符串。