Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在delphi中,存储过程的返回值始终为空_Sql_Sql Server_Delphi_Stored Procedures - Fatal编程技术网

Sql 在delphi中,存储过程的返回值始终为空

Sql 在delphi中,存储过程的返回值始终为空,sql,sql-server,delphi,stored-procedures,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:

我对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
但由于某种原因,当我调试时,test的值总是
null
,为什么


错误:

如果要使用所述参数@errMesaj,则必须使用来定义它

SQLServer过程的结果值限制为整数

显示不同可能性的示例如下所示:

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

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

如果要按说明使用参数@errMesaj,则必须使用定义它

SQLServer过程的结果值限制为整数

显示不同可能性的示例如下所示:

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

您得到的错误是因为

test:=sp_adaugaUser.Parameters.ParamByName('@errMesaj').Value该值为空,无法转换为字符串。

是否出现异常?执行用户似乎没有创建登录名或用户的权限。我已经获得了权限,我100%使用sa用户连接SQL。我用错误图片更新了帖子。如果SQL Server允许您如上所述更改存储过程,我真的很惊讶。我本来希望看到一条错误消息,因为RETURN应该返回一个整数值,而不是varchar。@Craig Young为什么?如果我这样做,它对examen很有用:declare result varchar(30)exec result=sp_adaugaUser'x',y'打印结果。它工作得很好你有例外吗?执行用户似乎没有创建登录名或用户的权限。我已经获得了权限,我100%使用sa用户连接SQL。我用错误图片更新了帖子。如果SQL Server允许您如上所述更改存储过程,我真的很惊讶。我本来希望看到一条错误消息,因为RETURN应该返回一个整数值,而不是varchar。@Craig Young为什么?如果我这样做,它对examen很有用:declare result varchar(30)exec result=sp_adaugaUser'x',y'打印结果。它工作得很好,我得到同样的错误。。。即使我在SQL中添加@errMesaj作为输出变量。只要省略
RETURN@errMesaj
,结果值应该是一个整数。您不需要在调用sp的查询中包含OUT吗?@MartinA Delphi会将其声明为
pdInputOutput
,如果您使用TStoredProc@bummi我不同意你的评论,你能说得更具体些吗。为什么要删除RETURN语句?如果我使用整数作为返回值,我也会得到相同的错误。我不知道我做错了什么。我也犯了同样的错误。。。即使我在SQL中添加@errMesaj作为输出变量。只要省略
RETURN@errMesaj
,结果值应该是一个整数。您不需要在调用sp的查询中包含OUT吗?@MartinA Delphi会将其声明为
pdInputOutput
,如果您使用TStoredProc@bummi我不同意你的评论,你能说得更具体些吗。为什么要删除RETURN语句?如果我使用整数作为返回值,我也会得到相同的错误。我不知道我做错了什么。