none
Problemas para modificar el campo "precio" RRS feed

  • Pregunta

  • Hola

    En SQL en la tabla Comida el precio esta como decimal (6,2)

    En el procedimiento almacenado que llamo cuando modifico el precio de una comida esta asi:

    ALTER procedure [dbo].[ActualizaComidas]

    @id_comida int, @nombreComida varchar(50), @precio float, @stock int, @Status_comida bit


    as



    if NOT EXISTS (SELECT id_comida from Comida where id_comida = @id_comida)

    print 'No existe el identificador de comida'

    else

    update Comida set nombreComida=@nombreComida, precio=@precio, stock=@stock,Status_comida=@Status_comida where id_comida=@id_comida

    Dentro del boton "Aceptar" tengo este codigo:

      private void BtnModificarAceptar_Click(object sender, EventArgs e)
            {
                Modificar();
            }

    Modificar es:

            public override Boolean Modificar()
            {





                if (txtStockModificar.Text == "")
                {
                    MessageBox.Show("Ingrese el stock porfavor", "Mensaje importante", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtPrecioModificarComida.Focus();

                }


                else
                {
                    try
                    {
                        string cmd = string.Format("EXEC ActualizaComidas '{0}','{1}','{2}','{3}','{4}'", txtIdComidaModificar.Text.Trim(),txtNombreModificarComida.Text.Trim(), txtPrecioModificarComida.Text.Trim(), txtStockModificar.Text.Trim(),chkStatusModificarComida.Checked.ToString());
                        Utilidades.Ejecutar(cmd);
                        dataGridView1.DataSource = LlenarDataGV("Comida").Tables[0];
    MessageBoxIcon.Information);
                        txtIdComidaModificar.Text = "";
                        txtNombreModificarComida.Text = "";
                        txtPrecioModificarComida.Text = "";
                        txtStockModificar.Text = "";
                        chkStatusModificarComida.Checked = false;
                        return true;
                    }

                    catch (Exception error)
                    {
                        MessageBox.Show("Ha ocurrido un error: " + error.Message);
                        return false;
                    }

                    finally
                    {
                        conexion.Close();

                    }
                }
                return false;

            }

    Bien, ahora les comento el inconveniente. Cuando hago clic sobre una fila del Datagridview, se me completan solo los textbox


    El problema es que si actualizo el precio, me sale esto:

    Si reemplazo la coma por un punto si me lo deja guardar, es decir reemplazar 99,99 por 99.00 .

    El problema es: Porque me toma la coma como un varchar?

    El codigo para traer el dato del datagridview a la columna txtPrecio es: 

     txtPrecioModificarComida.Text = dgv.Cells[2].Value.ToString();


    A

    viernes, 9 de octubre de 2020 11:38

Respuestas

  • Casi seguro que el error es por culpa de esta línea:

    string cmd = string.Format("EXEC ActualizaComidas '{0}','{1}','{2}','{3}','{4}'",

    fíjate que llamas al procedimiento poniendo el precio entre comillas. Eso indica que es de tipo varchar. Pero en el procedimiento, el parámetro precio es de tipo float. No pasa nada, SQL Server es capaz de convertir implícitamente de varchar a float... a condición de que el formato del varchar sea el mismo que SQL server espera para los floats. No vale con que el formato sea el empleado pare números en el programa cliente que llama al procedimiento. Esta conversión se realiza en lado servidor, por lo que el formato tiene que ser forzosamente el que entiende el SQL. Y el SQL siempre usa un punto para los decimales, no se puede usar una coma.

    El remedio chapucero es poner un Replace para cambiar la coma por un punto (bien sea en lado cliente o bien en el SQL).

    El remedio "bueno" es parametrizar la sentencia, declarar un parámetro de tipo float, parsear el textbox en lado cliente convirtiéndolo a float y asignar el float al parámetro.

    Por cierto, si el campo es de tipo Decimal(6,2), sería conveniente que el parámetro también sea de tipo Decimal(6,2). Si lo pasas como float, se tiene que realizar una conversión implícita de float a Decimal antes de grabarlo, y puedes tener problemas con los redondeos. Evidentemente, si lo cambias a Decimal, entonces todo lo que te he dicho antes del parámetro y el Parse también hay que cambiarlo a Decimal en lugar de Float.

    • Marcado como respuesta Eric_96 viernes, 9 de octubre de 2020 15:00
    viernes, 9 de octubre de 2020 13:40
    Moderador

Todas las respuestas

  • Casi seguro que el error es por culpa de esta línea:

    string cmd = string.Format("EXEC ActualizaComidas '{0}','{1}','{2}','{3}','{4}'",

    fíjate que llamas al procedimiento poniendo el precio entre comillas. Eso indica que es de tipo varchar. Pero en el procedimiento, el parámetro precio es de tipo float. No pasa nada, SQL Server es capaz de convertir implícitamente de varchar a float... a condición de que el formato del varchar sea el mismo que SQL server espera para los floats. No vale con que el formato sea el empleado pare números en el programa cliente que llama al procedimiento. Esta conversión se realiza en lado servidor, por lo que el formato tiene que ser forzosamente el que entiende el SQL. Y el SQL siempre usa un punto para los decimales, no se puede usar una coma.

    El remedio chapucero es poner un Replace para cambiar la coma por un punto (bien sea en lado cliente o bien en el SQL).

    El remedio "bueno" es parametrizar la sentencia, declarar un parámetro de tipo float, parsear el textbox en lado cliente convirtiéndolo a float y asignar el float al parámetro.

    Por cierto, si el campo es de tipo Decimal(6,2), sería conveniente que el parámetro también sea de tipo Decimal(6,2). Si lo pasas como float, se tiene que realizar una conversión implícita de float a Decimal antes de grabarlo, y puedes tener problemas con los redondeos. Evidentemente, si lo cambias a Decimal, entonces todo lo que te he dicho antes del parámetro y el Parse también hay que cambiarlo a Decimal en lugar de Float.

    • Marcado como respuesta Eric_96 viernes, 9 de octubre de 2020 15:00
    viernes, 9 de octubre de 2020 13:40
    Moderador
  • Muchas gracias Alberto

    A

    viernes, 9 de octubre de 2020 15:01
  • Gracias por levantar tu consulta en los foros de MSDN. Cerraremos el Hilo, por ende si tiene alguna otra consulta por favor genera otra consulta para que la comunidad de foros te pueda asesorar.

     

    Siempre es un placer atender tus consultas!

    --------------------------------------------------------------------------------

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    lunes, 12 de octubre de 2020 12:31
    Moderador