Insertar datos en un campo fecha de una base de datos access 2013 desde C#

publicado por: Anonymous

Tengo una base de datos de Access 2013 con varias tablas, y en algunas de ellas campos de tipo “Fecha Corta”. El asunto es que al intentar introducir datos mediante una sentencia SQL INSERT desde C#, me da el siguiene error: “No coinciden los tipos de datos en la expresión de criterios.”

Probé con otra tabla que no tiene campos fecha y no tuve ningún problema en hacer el INSERT, por lo que llegué a la conclusión de que el problema es el campo fecha.

El valor de la fecha lo estoy tomando de un DateTimePicker llamado dtpFechaNac.

Cómo debería formatear estos campos para que Access 2013 me los tome correctamente?

Formatos que probé:

- dtpFechaNac.Value
- dtpFechaNac.Value.ToString("dd/MM/yyyy")
- dtpFechaNac.Value.ToShortDateString();

CODIGO (lo más relevante):

string cmd = string.Format("INSERT INTO DatosPersonales " +
                     "([Dni], [NombreApe], [Nacionalidad], [FechaNac], " +
                     "[Edad], [EstadoCiv], [Hijos], [Direccion], " +
                     "[Localidad], [CodigoPos], [Telefono], [Celular], " +
                     "[Educacion], [Email]) " +
                     "VALUES (@Param1, @Param2, @Param3, @Param4, @Param5, @Param6, " +
                     "@Param7, @Param8, @Param9, @Param10, @Param11, @Param12, " +
                     "@Param13, @Param14)");

        List<object> parametros = new List<object>();
        parametros.Add(Convert.ToInt32(txtDni.Text));
        parametros.Add(txtNombreApe.Text);
        parametros.Add(txtNacionalidad.Text);
        parametros.Add(dtpFechaNac.Value.ToString("dd/MM/yyyy")); //Aca esta el problema
        parametros.Add(txtEdad.Text);
        parametros.Add(cboEstadoCiv.SelectedItem.ToString());
        parametros.Add(txtHijos.Text);
        parametros.Add(txtDireccion.Text);
        parametros.Add(txtLocalidad.Text);
        parametros.Add(txtCodigoPos.Text);
        parametros.Add(txtTelefono.Text);
        parametros.Add(txtCelular.Text);
        parametros.Add(txtEducacion.Text);
        parametros.Add(txtEmail.Text);

OleDbCommand command = new OleDbCommand(cmd, CrearConexionDB());

if(parametros != null)
        {
            for (int i = 0; i < parametros.Count(); i++)
            {
                command.Parameters.AddWithValue("Param" + i.ToString(), parametros[i]);
            }
        }

        command.Connection.Open();
        return command.ExecuteNonQuery();

SOLUCIONADO:

No hay que convertir a string como bien dijo el amigo gbianchi, con tomar el valor directamente del DateTimePicker (en mi caso) la conversión se realiza automáticamente. El problema que tenía yo era que en la base de datos tenía otro campo definido como numérico que se me pasó por alto (error mío).

solución

El problema que estas teniendo es que estas transformando la fecha a cadena antes de pasarla como parámetro, entonces la query queda mal construida al momento de pasársela a access.

Access trabaja las fechas entre #, por lo tanto si le pasaras un objeto fecha en lugar de string, access la transformaría según corresponda. Como no lo haces, Access la trata como un string y falla la conversión.

Es mas, yo te recomendaría eliminar la carga de los parámetros a una lista (que es de objetos, pero solo le pasas strings) y pasarlos directamente al objeto parameters del command.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *