Usuário com melhor resposta
Problema ao Retornar Valor de uma SP

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.
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
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
-
-
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.
-
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