none
¿Como solucionar el error en visual studio "Error al convertir el tipo varchar a date"? RRS feed

  • Pregunta

  • Hola buenas noches, Soy nuevo y no tengo mucha experiencia en programación. Estoy trabajando en un programa para un proyecto escolar pero me da un error al momento de salvar datos. Gracias de antemano, espero que puedan ayudarme. Aquí dejo la parte del código de sql y visual studio(C#).

           

       Visual Studio:     

    public override Boolean Guardar()
            {
                try 
                {
                    string cmd = string.Format("EXEC ActualizaPrestamos '{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}'", txtidpre.Text.Trim(), txtnom.Text.Trim(), txtnomart.Text.Trim(), txtfein.Text.Trim(), txtidus.Text.Trim(), txtidart.Text.Trim(), txtcomen.Text.Trim());

                    Utilidades.Ejecutar(cmd);
                    MessageBox.Show("Se ha guardado correctamente");
                    return true;
                }
                catch (Exception error)
                {
                    MessageBox.Show("Ha ocurrido un error: " + error.Message);
                    return false;
                }
            }

    Sql Procedimiento almacenado

    @Id_pre int, @Nom_pres varchar(50), @Prod varchar (50), @Fecha date, @Id_us int, @FechaEn date, @comen varchar (100), @id_pro int 

    as

    --ActualizaPrestamo

    if NOT EXISTS (SELECT id_prestamo FROM prestamos where id_prestamo=@Id_pre)
    insert into prestamos (id_prestamo, Nombr_prestamo, Producto, Fecha_inicio, id_us_encargado, Fecha_devolucion, Comentario, id_pro) values (@Id_pre, @Nom_pres, @Prod, @Fecha, @Id_us, @FechaEn, @comen, @id_pro)

    else

    update prestamos set id_prestamo=@Id_pre, Nombr_prestamo=@Nom_pres, Producto=@Prod, Fecha_inicio=@Fecha, id_us_encargado=@Id_us, Fecha_devolucion=@FechaEn, Comentario=@comen, id_pro=@id_pro

    lunes, 12 de agosto de 2019 4:38

Todas las respuestas

  • hola

    No se invoca un procedure de esa forma

    No se que hace el "Utilidades.Ejecutar()" pero sino permite parametros descartalo

    Tu codigo deberia ser algo como esto

    using (SqlConnection conn = new SqlConnection("connectionstring")) 
    { 
    
        SqlCommand cmd = new SqlCommand("ActualizaPrestamos", conn); 
        cmd.CommandType = SqlCommandType.StoredProcedure; 
    
        cmd.Parameters.AddWithValue("@Id_pre", Convert.ToInt32(txtidpre.Text)); 
    	cmd.Parameters.AddWithValue("@Nom_pres", txtnom.Text); 
    	cmd.Parameters.AddWithValue("@Prod", txtnomart.Text); 
    	cmd.Parameters.AddWithValue("@Fecha", Convert.ToDateTime(txtfein.Text)); 
    	cmd.Parameters.AddWithValue("@Id_us", Convert.ToInt32(txtidus.Text)); 
    	cmd.Parameters.AddWithValue("@FechaEn", Convert.ToDateTime(??)); 
    	cmd.Parameters.AddWithValue("@comen", txtcomen.Text); 
    	cmd.Parameters.AddWithValue("@id_pro", ??); 
        
        cmd.ExecuteNonQuery(); 
    }

    Lo que noto es que hay parametros que no defines como es el caso de @FechaEn o @id_prod

    ademas debes respectar los tipod de datos, si es int debes pasar un numerico si es una fecha un datetime, eso uniendo en un string no se puede lograr por eso deebs usar parametros

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 12 de agosto de 2019 6:08
  • Aunque Leandro ya te ha aportado una sugerencia acerca de "cómo se debería hacer", creo que también es conveniente que comprendas por qué da un error cuando lo haces como lo estás haciendo, para que no sufras el mismo problema en el futuro.

    La razón está en el String.Format, donde introduces varios parámetros dentro de una sentencia SQL. Al pasarle el txtfein.Text para que lo meta dentro del '{3}', el format copia literalmente el .Text a la cadena SQL. Esto hace que quede dentro de la cadena con el mismo formato con el que se tecleó en pantalla dentro del textbox. Si dicho formato no coincide con el que espera el lenguaje SQL, sale el error de conversión que estás viendo.

    ¿Y qué formato espera el SQL? Pues tiene que ser MM/dd/yyyy o bien yyyyMMdd. Si lo tecleas, por ejemplo, como dd/MM/yyyy pues entonces no funciona.

    ¿Cuál es el remedio? Tu código debe tomar el texto del TextBox y convertirlo en DateTime, por ejemplo, usando DateTime.TryParse o TryParseExact. Estas funciones permiten especificar el formato en caso de que no quieras usar el predeterminado en el Panel de Control de Windows. Y una vez que tienes el valor en binario dentro de un DateTime, entonces ese valor es el que le pasas al Sql. Si lo pasas en un parámetro como te dijeron en una respuesta anterior, entonces el datetime es lo que le pasas al AddWithValue. Y si lo pasas directo a la sentencia mediante el String.Format, entonces dentro del Format pones el formato deseado: '{2:MM/dd/yyyy}'. Ojo esto solo vale si le pasas un DateTime. Si lo dejas con el .Text como tienes ahora, no funcionará.

    lunes, 12 de agosto de 2019 8:09
    Moderador