Saltar al contenido principal

 none
Ayuda con parámetros de salida de procedimientos almacenados en ASP .Net Core 2 RRS feed

  • Pregunta

  • Estoy tratando de obtener el resultado del procedimiento almacenado a través de los parámetros de salida. El problema es que no se actualizan, se quedan con el valor que les asigno inicialmente.

    Ya he probado desde el Management Studio de SQL Server y los parámetros de salida trabajan corectamente.

    La llamada se hace correctamente desde Visual Studio. El SP devuelve el set de datos sin problema, el único detalle es que no se actualizan los valores de los parámetros de salida.

    ¿Qué estoy haciendo mal?

    Este es el código.

    Les agradezco el apoyo.

    [HttpGet("busqueda")]
          public async Task<ActionResult<ViewModelClienteEncabezado>> ObtenerClientesPorCodigo()
          {
             try
             {
                using (SqlConnection conexion = new SqlConnection(_configuracion.GetSection("ConnectionStrings").GetSection("DatabaseConnection").Value))
                {
                   using (SqlCommand comando = new SqlCommand("cliente.paObtenerEncabezadoClientes", conexion))
                   {
                      comando.CommandType = System.Data.CommandType.StoredProcedure;

                      comando.Parameters.Add(new SqlParameter("@pi_estatus", SqlDbType.Int) { Direction = ParameterDirection.InputOutput, Value = 1 });
                      comando.Parameters.Add(new SqlParameter("@pnvc_respuesta", SqlDbType.NVarChar, 4000) { Direction = ParameterDirection.InputOutput, Value = "" });
                      comando.Parameters.Add(new SqlParameter("@pnvc_error_mensaje", SqlDbType.NVarChar, 4000) { Direction = ParameterDirection.InputOutput, Value = "" });
                      comando.Parameters.Add(new SqlParameter("@pi_error_numero", SqlDbType.Int) { Direction = ParameterDirection.InputOutput, Value = -1 });
                      comando.Parameters.Add(new SqlParameter("@pnvc_error_procedimiento", SqlDbType.NVarChar, 128) { Direction = ParameterDirection.InputOutput, Value = "cliente.paObtenerEncabezadoClientes" });
                      comando.Parameters.Add(new SqlParameter("@pi_error_linea", SqlDbType.Int) { Direction = ParameterDirection.InputOutput, Value = -1 });
                      comando.Parameters.Add(new SqlParameter("@pi_error_severidad", SqlDbType.Int) { Direction = ParameterDirection.InputOutput, Value = -1 });
                      comando.Parameters.Add(new SqlParameter("@pi_error_estado", SqlDbType.Int) { Direction = ParameterDirection.InputOutput, Value = -1 });

                      var lstClientesEncabezado = new List<ViewModelClienteEncabezado>();

                      await conexion.OpenAsync();

                      using (var lector = await comando.ExecuteReaderAsync())
                      {
                         if ((int)comando.Parameters["@pi_estatus"].Value == 0)
                         {
                            while (await lector.ReadAsync())
                            {
                               lstClientesEncabezado.Add(new ViewModelClienteEncabezado()
                               {
                                  Id = (int)lector["Id"],
                                  Codigo = lector["Codigo"].ToString(),
                                  RazonSocial = lector["RazonSocial"].ToString(),
                                  Descripcion = lector["Descripcion"].ToString(),
                                  FechaIngreso = (DateTime)lector["FechaIngreso"],
                                  Estatus = (int)lector["Estatus"],
                                  PropietarioId = (int)lector["PropietarioId"],
                                  PropietarioNombre = lector["PropietarioNombre"].ToString(),
                                  ContactoId = (int)lector["ContactoId"],
                                  ContactoNombre = lector["ContactoNombre"].ToString()
                               });
                            }
                         }
                         else
                         {
                            throw new System.Exception(comando.Parameters["@pnvc_respuesta"].Value.ToString());
                         }
                      }

                      return Ok(lstClientesEncabezado);
                   }
                }
             }
             catch (Exception ex)
             {
                _logger.LogError(ex.Message);
                return StatusCode(500);
             }
          }
    martes, 20 de agosto de 2019 4:58

Respuestas

  • hola

    Puede que el problema sea que estas accediando a un reader junto a los parametros de salida

    Si estas obteniendo registros, para que necesitas los parametros de estado y error? accede a los datos y si algo falla lo controlas con un try..catch, no le veo sentido parametros de salida en este caso, la salida ya es el reader que recorres

    Ademas solo accedes a un unico parametro "pi_estatus", que valores toman los otros ?

    saludos

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Pablo RubioModerator miércoles, 21 de agosto de 2019 15:48
    • Marcado como respuesta miguelpm2018 domingo, 22 de septiembre de 2019 21:00
    martes, 20 de agosto de 2019 5:35
  • Mientras el SqlDataReader está abierto, mantiene "ocupada" la conexión y los parámetros no pueden fluir por ella. Es necesario primero cerrar el datareader y después puedes leer los valores de los parámetros. Obviamente hay que leerlos antes de cerrar el SqlConnection.
    • Propuesto como respuesta Pablo RubioModerator miércoles, 21 de agosto de 2019 15:48
    • Marcado como respuesta miguelpm2018 domingo, 22 de septiembre de 2019 21:01
    martes, 20 de agosto de 2019 6:00

Todas las respuestas

  • hola

    Puede que el problema sea que estas accediando a un reader junto a los parametros de salida

    Si estas obteniendo registros, para que necesitas los parametros de estado y error? accede a los datos y si algo falla lo controlas con un try..catch, no le veo sentido parametros de salida en este caso, la salida ya es el reader que recorres

    Ademas solo accedes a un unico parametro "pi_estatus", que valores toman los otros ?

    saludos

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Pablo RubioModerator miércoles, 21 de agosto de 2019 15:48
    • Marcado como respuesta miguelpm2018 domingo, 22 de septiembre de 2019 21:00
    martes, 20 de agosto de 2019 5:35
  • Mientras el SqlDataReader está abierto, mantiene "ocupada" la conexión y los parámetros no pueden fluir por ella. Es necesario primero cerrar el datareader y después puedes leer los valores de los parámetros. Obviamente hay que leerlos antes de cerrar el SqlConnection.
    • Propuesto como respuesta Pablo RubioModerator miércoles, 21 de agosto de 2019 15:48
    • Marcado como respuesta miguelpm2018 domingo, 22 de septiembre de 2019 21:01
    martes, 20 de agosto de 2019 6:00
  • Antes que nada agradezco mucho tu respuesta.

    Tomaré en cuenta tu recomendación.

    Gracias.


    MAPM

    domingo, 22 de septiembre de 2019 20:59
  • Muchas gracias por el comentario.

    saludos...


    MAPM

    domingo, 22 de septiembre de 2019 21:00