存储过程的返回值在delphi中始终为null

时间:2014-06-30 12:58:02

标签: sql sql-server delphi stored-procedures

我在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时,为什么?

错误:enter image description here

1 个答案:

答案 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,您的参数应如下所示

enter image description here enter image description here

你得到的错误是因为 test := sp_adaugaUser.Parameters.ParamByName('@errMesaj').Value;值为NULL,无法转换为字符串。