none
Problema ao Retornar Valor de uma SP RRS feed

  • Pergunta

  • Tenho uma SP que retorna o id da linha inserida, executando diretamente a SP ela funciona sem problemas.

    O problema é quando executo pelo C#, ele diz " Procedure or Function 'SP_GrupoInserir' expects parameter '@IDINSERIDA', which was not supplied."

    Segue abaixo a SP

    USE [CRM_Desenv]
    GO
    /****** Object:  StoredProcedure [dbo].[SP_GrupoInserir]    Script Date: 01/30/2013 23:12:53 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[SP_GrupoInserir] 
    	(
    		@T0004_STATUS				INT,
    		@T0004_GRUPO				varchar (50),
    		@T0002_ID					bigint,
    		@T0004_ID					bigint = NULL,
    		@IDINSERIDA					bigint output
    	)
    AS
    
    BEGIN TRY
    
    IF(@T0004_ID is null)/*Caso não encontre nenhum registro com o ID informado o sistema retorna o ID [0], neste caso incluir o bloco*/
    	BEGIN
    		PRINT('Incluir Registro')
    		INSERT INTO T0004_GRUPOS(
    				T0004_GRUPO,
    				T0004_STATUS,
    				T0002_ID
    		)VALUES(
    				@T0004_GRUPO,
    				@T0004_STATUS,
    				@T0002_ID
    		)
    
    		SET @IDINSERIDA = CAST(SCOPE_IDENTITY() AS INT)
    		print (@IDINSERIDA)
    	END
    ELSE
    	BEGIN
    		PRINT('Atualizar Registro')
    		UPDATE T0004_GRUPOS
    			SET
    				T0004_GRUPO = @T0004_GRUPO,
    				T0004_STATUS = @T0004_STATUS,
    				T0002_ID = @T0002_ID
    		WHERE T0004_ID = @T0004_ID
    
    		return @T0004_ID
    	END
    
    END TRY
    
    BEGIN CATCH
    	print ''
    	print 'Ocorreu um erro!'
    	print 'Mensagem: ' + ERROR_MESSAGE()
    	print 'Procedure: ' + ERROR_PROCEDURE()
    END CATCH

    Codigo C#

            public int Inserir(GrupoController Grupo)
            {
                string ConnSTR = ConfigurationManager.AppSettings["ConnectionString"];
                ConnSTR = Cript.Decrypt(ConnSTR);
    
                SqlConnection conn = new SqlConnection(ConnSTR);
                string sCommand = "SP_GrupoInserir";
    
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = sCommand;
                cmd.CommandType = CommandType.StoredProcedure;
    
                //parametros de entrada
                cmd.Parameters.Add(new SqlParameter("@T0004_GRUPO", SqlDbType.Text)).Value = Grupo.NOME;
                cmd.Parameters.Add(new SqlParameter("@T0004_STATUS", SqlDbType.Int)).Value = Grupo.STATUS;
                cmd.Parameters.Add(new SqlParameter("@T0002_ID", SqlDbType.Int)).Value = Grupo.EMPRESA;
    
                if (Grupo.ID != 0)
                {
                    cmd.Parameters.Add(new SqlParameter("@T0004_ID", SqlDbType.Int)).Value = Grupo.ID;
                }
    
                //parametros de saida
                var parametroSaida = cmd.Parameters.Add("@IDINSERIDA", SqlDbType.Int);
                parametroSaida.Direction = ParameterDirection.ReturnValue;
                
                try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
                return Convert.ToInt32(parametroSaida.Value);
            }

    Alguém sabe qual o problema?

    Att.

    quinta-feira, 31 de janeiro de 2013 01:33

Respostas

  • Consegui resolver dessa forma

    Troquei o código de retorno sql

    ALTER PROCEDURE [dbo].[SP_GrupoInserir] 
    	(
    		@T0004_STATUS				INT,
    		@T0004_GRUPO				varchar (50),
    		@T0002_ID					bigint,
    		@T0004_ID					bigint = NULL
    
    		--@IDINSERIDA					BIGINT output
    	)
    AS
    
    DECLARE @IDINSERIDA	BIGINT
    SET @IDINSERIDA = 0
    
    BEGIN TRY
    
    IF(@T0004_ID is null)/*Caso não encontre nenhum registro com o ID informado o sistema retorna o ID [0], neste caso incluir o bloco*/
    	BEGIN
    		PRINT('Incluir Registro')
    		INSERT INTO T0004_GRUPOS(
    				T0004_GRUPO,
    				T0004_STATUS,
    				T0002_ID
    		)VALUES(
    				@T0004_GRUPO,
    				@T0004_STATUS,
    				@T0002_ID
    		)
    
    		SET @IDINSERIDA = SCOPE_IDENTITY()
    		print (@IDINSERIDA)
    		RETURN @IDINSERIDA
    	END
    ELSE
    	BEGIN
    		PRINT('Atualizar Registro')
    		UPDATE T0004_GRUPOS
    			SET
    				T0004_GRUPO = @T0004_GRUPO,
    				T0004_STATUS = @T0004_STATUS,
    				T0002_ID = @T0002_ID
    		WHERE T0004_ID = @T0004_ID
    
    		SET @IDINSERIDA = @T0004_ID
    		RETURN @IDINSERIDA
    	END
    
    END TRY

    E o código c#

    public int Inserir(GrupoController Grupo)
            {
                string ConnSTR = ConfigurationManager.AppSettings["ConnectionString"];
                ConnSTR = Cript.Decrypt(ConnSTR);
    
                SqlConnection conn = new SqlConnection(ConnSTR);
                string sCommand = "SP_GrupoInserir";
    
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = sCommand;
                cmd.CommandType = CommandType.StoredProcedure;
    
                //parametros de entrada
                cmd.Parameters.Add(new SqlParameter("@T0004_GRUPO", SqlDbType.Text)).Value = Grupo.NOME;
                cmd.Parameters.Add(new SqlParameter("@T0004_STATUS", SqlDbType.Int)).Value = Grupo.STATUS;
                cmd.Parameters.Add(new SqlParameter("@T0002_ID", SqlDbType.Int)).Value = Grupo.EMPRESA;
                
                if (Grupo.ID != 0)
                {
                    cmd.Parameters.Add(new SqlParameter("@T0004_ID", SqlDbType.BigInt)).Value = Grupo.ID;
                }
    
                //parametros de saida
                var parametroSaida = cmd.Parameters.Add("@IDINSERIDA", SqlDbType.Int);
                parametroSaida.Direction = ParameterDirection.ReturnValue;
                
                try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
                return Convert.ToInt32(parametroSaida.Value);
            }

    • Marcado como Resposta MnMk sexta-feira, 1 de fevereiro de 2013 01:50
    sexta-feira, 1 de fevereiro de 2013 01:49

Todas as Respostas

  • Bom dia,

    Tente alterar o tipo do Direction de retorno do parâmetro para "ParameterDirection.Output".

    Outra coisa, você informou que os parâmetro da stored procedure é bigint, porem esta usando o SqlDbType na maioria apenas como int.

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    • Editado Vitor Mendes quinta-feira, 31 de janeiro de 2013 12:31
    quinta-feira, 31 de janeiro de 2013 12:30
  • Bom dia, troquei para ParameterDirection.Output, porém o erro continua.

    Quanto a int ou bigint não há problema.

    Alguma outra ideia?

    Att.

    quinta-feira, 31 de janeiro de 2013 20:44
  • Eu tentei também passar o @IDINSERIDA para ver se adiantava, mas ele continua dando o mesmo erro.

    E outra coisa, ele executa a linha

    var parametroSaida = cmd.Parameters.Add("@IDINSERIDA", SqlDbType.Int);

    e pula está.

    parametroSaida.Direction = ParameterDirection.ReturnValue;

    Ideias?

    Att.

    sexta-feira, 1 de fevereiro de 2013 01:40
  • Consegui resolver dessa forma

    Troquei o código de retorno sql

    ALTER PROCEDURE [dbo].[SP_GrupoInserir] 
    	(
    		@T0004_STATUS				INT,
    		@T0004_GRUPO				varchar (50),
    		@T0002_ID					bigint,
    		@T0004_ID					bigint = NULL
    
    		--@IDINSERIDA					BIGINT output
    	)
    AS
    
    DECLARE @IDINSERIDA	BIGINT
    SET @IDINSERIDA = 0
    
    BEGIN TRY
    
    IF(@T0004_ID is null)/*Caso não encontre nenhum registro com o ID informado o sistema retorna o ID [0], neste caso incluir o bloco*/
    	BEGIN
    		PRINT('Incluir Registro')
    		INSERT INTO T0004_GRUPOS(
    				T0004_GRUPO,
    				T0004_STATUS,
    				T0002_ID
    		)VALUES(
    				@T0004_GRUPO,
    				@T0004_STATUS,
    				@T0002_ID
    		)
    
    		SET @IDINSERIDA = SCOPE_IDENTITY()
    		print (@IDINSERIDA)
    		RETURN @IDINSERIDA
    	END
    ELSE
    	BEGIN
    		PRINT('Atualizar Registro')
    		UPDATE T0004_GRUPOS
    			SET
    				T0004_GRUPO = @T0004_GRUPO,
    				T0004_STATUS = @T0004_STATUS,
    				T0002_ID = @T0002_ID
    		WHERE T0004_ID = @T0004_ID
    
    		SET @IDINSERIDA = @T0004_ID
    		RETURN @IDINSERIDA
    	END
    
    END TRY

    E o código c#

    public int Inserir(GrupoController Grupo)
            {
                string ConnSTR = ConfigurationManager.AppSettings["ConnectionString"];
                ConnSTR = Cript.Decrypt(ConnSTR);
    
                SqlConnection conn = new SqlConnection(ConnSTR);
                string sCommand = "SP_GrupoInserir";
    
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = sCommand;
                cmd.CommandType = CommandType.StoredProcedure;
    
                //parametros de entrada
                cmd.Parameters.Add(new SqlParameter("@T0004_GRUPO", SqlDbType.Text)).Value = Grupo.NOME;
                cmd.Parameters.Add(new SqlParameter("@T0004_STATUS", SqlDbType.Int)).Value = Grupo.STATUS;
                cmd.Parameters.Add(new SqlParameter("@T0002_ID", SqlDbType.Int)).Value = Grupo.EMPRESA;
                
                if (Grupo.ID != 0)
                {
                    cmd.Parameters.Add(new SqlParameter("@T0004_ID", SqlDbType.BigInt)).Value = Grupo.ID;
                }
    
                //parametros de saida
                var parametroSaida = cmd.Parameters.Add("@IDINSERIDA", SqlDbType.Int);
                parametroSaida.Direction = ParameterDirection.ReturnValue;
                
                try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
                return Convert.ToInt32(parametroSaida.Value);
            }

    • Marcado como Resposta MnMk sexta-feira, 1 de fevereiro de 2013 01:50
    sexta-feira, 1 de fevereiro de 2013 01:49