La valeur de return de la procédure stockée est toujours nulle dans delphi

J'ai un petit problème avec le server Delphi / SQL. J'ai un 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 --'Sa 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 --'Sa creat user si login' end RETURN @errMesaj END 

Ce SP ajoute un login et un user dans un server / une database … et renvoie un message basé sur ce qu'il a fait.

En Delphi, j'ai un TADOStoredProcedure qui a 3 parameters:

1: @User – ftSsortingng, pdInput 2: @Password – ftSsortingng, pdInput 1: @errMesaj – ftSsortingng, pdReturnValue

J'appelle le TADOStoredProcedure comme ceci:

 procedure TdataModule1.AdaugaUser(user, password : ssortingng ); // 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; 

mais pour une raison quelconque, lorsque je débogue la valeur de test est toujours null , pourquoi?

Erreur : entrez la description de l'image ici

Si vous voulez utiliser le paramètre @errMesaj comme décrit, vous devrez le définir avec 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 

La valeur RESULT de la procédure SQLServer est limitée à un entier Retour de données à partir d'une procédure stockée

Un exemple pour montrer les différentes possibilités pourrait ressembler à ceci:

 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 = 'Sa 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 = 'Sa creat user si login' set @ReturnCode = 2 end Return @ReturnCode END 

le code delphi minimal pour un appel

  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)); 

en utilisant un TAdoStoredProc pour sp_adaugaUser vos parameters devraient ressembler à ceci

entrez la description de l'image icientrez la description de l'image ici

l'erreur que vous obtenez est due au test := sp_adaugaUser.Parameters.ParamByName('@errMesaj').Value; la valeur est NULL qui ne peut pas être convertie en string.