none
No puedo insertar registros de tipo Double a una base de datos SQL RRS feed

  • Pregunta

  • Hola a todos, soy nuevo programando y me gustaría de antemano agradecer su ayuda.

    El caso es el siguiente, no he podido insertar datos en la base de datos tipo double en la base dados. 

    me sale el siguiente mensaje de error: 

    Información adicional: Los datos de cadena o binarios se truncarían.

    la estructura de la tabla es: 

    create table factura(
    id_Facutura int identity,
    nombre varchar (50),
    apellidos varchar (70),
    fecha varchar (30),
    producto Varchar (30),
    numUnidades int,
    precio float, 
    total float 
    )

    El método para insertar es:

    public string InsertarReg(string nombre, string apellidos, string fecha, string producto,int unidades, double precio, double total)
            {
                string Salida;
                cmd = new SqlCommand("Insert into factura values('" + nombre+"', '"+apellidos+"','"+fecha+"','"+producto+"',"+unidades+","+precio+","+total+")", cn);
                cmd.ExecuteNonQuery();
                Salida = "El registro se ingreso con exito";
                return Salida;

    y el codigo dentro del botón insertar es: 

    double precio = Convert.ToDouble(txtprecioUnidad.Text);
    int unidad = Convert.ToInt32(txtnumUnidades.Text);             
    double total = Convert.ToDouble(precio) * unidad;

    con.InsertarReg(txtnombre.Text, txtApellidos.Text, dtpFecha.Text, txtnombreProduc.Text,Convert.ToInt32(txtnumUnidades.Text), Convert.ToDouble(txtprecioUnidad.Text),total);
    con.Consulta(dgv);

    Ya revise el código y no encuentro que este mal, se que el mensaje de error me marca que el tipo de dato que quiero ingresar no coincide con el tipo de dato de los campos de la base de datos pero ya hice todo tipo de modificaciones, tanto en la tabla como en el código de la aplicación, y nada, espero puedan ayudarme a solucionar mi problema, Saludos.   

    sábado, 4 de noviembre de 2017 3:03

Respuestas

  • Ya revise el código y no encuentro que este mal

    Bien, veamos, cosas que están mal:

    1) No puedes hacer un insert en una tabla que tiene un Identity sin especificar la lista de campos que se insertan, entre los que hay que excluir el identity (Pon la lista de nombres de campos entre paréntesis detrás de "factura").

    2) Estás concatenando los campos en la sentencia en lugar de parametrizarla, cosa que es una pésima práctica porque hace que tu código sea vulnerable ante ataques de inyección de SQL, además de no escapar correctamente los caracteres especiales, y polucionar la caché de procedimientos en el servidor de base de datos.

    4) Algunos campos son numéricos, por ejemplo la variable precio es float, y la estás concatenando en un string con el símbolo "+". Esto hace que se convierta de float a string en el formato predeterminado del sistema, que probablemente no es el formato correcto para SQL. Por ejemplo, si el formato predeterminado en ese equipo utiliza una coma para los decimales, y tu valor es 12,34, al concatenarlo en la sentencia se creerá que son dos campos "12" y "34" y te dará toda clase de errores. Esto se evita parametrizando la sentencia, pero si no quieres parametrizarla tienes que meter una conversión explícita de float a string forzando el formato para que use un punto en lugar de la coma.

    5) Lo mismo del apartado anterior se aplicaría a la fecha si la estuvieras salvando como datetime, que no es el caso pero convendría que lo fuera si piensas alguna vez hacer búsquedas por rango de fecha. Igual que en el caso anterior, habría que forzar a que se convierta a string usando el formato de la base de datos, no el predeterminado del sistema. Igualmente, se evita parametrizando, si no quieres andar jugando con los formatos.


    sábado, 4 de noviembre de 2017 9:31