[ Foro de C# ]

Como grabar fecha con DateTimePicker

10-Aug-2014 02:26
Yordys Dominguez
3 Respuestas

Saludos a todos. Soy bien nuevo en esto de los foros y la programacion.  Mi problema es el siguiente: En este cuatrimestre nuestro profesor nos está enseñando a programar en capas.  Estoy intentando grabar la fecha de un formulario de Pedidos usando un DateTimePicker para que me grabe la fecha cuando pulse mi boton de guardar.  Empiezo declarando  en mi base de datos en mi tabla Pedidos la columna Fecha con parámetro Date. En mi capa Entidad Pedidos declaré Fecha como DateTime {get;set;}. En mi capa Datos tengo mi clase llamada PedidosDAL donde tengo mi procedimiento almacenado así:

 
  public void InsertarPedidos(Pedidos Pedidos)
        {
            AccesoDatos.ObtenerConexion().Open();
            using (ComandoSQL = new SqlCommand())
            {   ComandoSQL.Connection = AccesoDatos.ObtenerConexion();
                ComandoSQL.CommandType = CommandType.StoredProcedure;
                ComandoSQL.CommandText = "InsertarPedidos";
                try
                {
                    ComandoSQL.Parameters.AddWithValue("@Codigo", Pedidos.Codigo);
                    ComandoSQL.Parameters.AddWithValue("@Pedido", Pedidos.Pedido);
                    ComandoSQL.Parameters.AddWithValue("@Producto", Pedidos.Producto);
                    ComandoSQL.Parameters.AddWithValue("@Telefono", Pedidos.Telefono);                
                    ComandoSQL.Parameters.AddWithValue("@Fecha", Pedidos.Fecha);
                    ComandoSQL.Parameters.AddWithValue("@Condicion", Pedidos.Condicion);
                    ComandoSQL.Parameters.AddWithValue("@Cantidad", Pedidos.Cantidad);
                    ComandoSQL.Parameters.AddWithValue("@Precio", Pedidos.Precio);
                    ComandoSQL.Parameters.AddWithValue("@Total", Pedidos.Total);
                    ComandoSQL.ExecuteNonQuery();
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    AccesoDatos.ObtenerConexion().Close();
                }
            }
        }
 
Ya en mi formulario de Pedidos tengo este metodo para validar:
public bool validar()
        {
            bool valor = false;
 
            if (!string.IsNullOrWhiteSpace(txtcodigopedido.Text) && !string.IsNullOrWhiteSpace(txtnumeropedido.Text))
            {
                valor = true;
            }
            return valor;
        }
 
En mi boton Aceptar el codigo es el siguiente:
 
 private void btnaceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (validar())
                {
                    PedidosClientesBL cli = new PedidosClientesBL();
                    Pedidos entidades = new Pedidos();
 
                    Codigo = Convert.ToInt32(txtcodigopedido.Text);
                    if (txtcodigopedido.Text == string.Empty)
                        txtcodigopedido.Text = null;
                    entidades.Codigo = Codigo;
 
                    Numero = Convert.ToInt32(txtnumeropedido.Text);
 
                    if (txtnumeropedido.Text == string.Empty)
                        txtnumeropedido.Text = null;
                    entidades.Pedido = Numero;
 
                    if (cbocondicion.Text == string.Empty)
                        cbocondicion.Text = null;
                    entidades.Condicion = cbocondicion.Text;
 
                    if (txttelefono.Text == string.Empty)
                        txttelefono.Text = null;
                    entidades.Telefono = txttelefono.Text;
 
                    if (txtproducto.Text == string.Empty)
                        txtproducto.Text = null;
                    entidades.Producto = txtproducto.Text;
 
                    Cantidad = Convert.ToInt32(textcantidad.Text);
                    if (textcantidad.Text == string.Empty)
                        textcantidad.Text = null;
                    entidades.Cantidad = Cantidad;
 
                    decimal Precio = Convert.ToDecimal(textprecio.Text);
                    if (textprecio.Text == string.Empty)
                        textprecio.Text = null;
                    entidades.Precio = Precio;
 
                    decimal Total = Convert.ToDecimal(texttotal.Text);
                    if (texttotal.Text == string.Empty)
                        texttotal.Text = null;
                    entidades.Total = Total;
 
//Aqui las formas que he intentado para convertir el DateTimePicker que llamé dtpfecha1
                    //dtpfecha1 = Convert.ToDateTime(dtpfecha1.Text.ToString();
                    //entidades.Fecha = Convert.ToDateTime(dtpfecha1.Text.ToString());
                   // entidades.Fecha = dtpfecha1.Value;
                    //dtpfecha1.Text = Convert.ToDateTime(dtpfecha1.Value);
                   // entidades.Fecha = Convert.ToString(dtpfecha1.Text.ToString());
                   // dtpfecha1.Value = Convert.ToDateTime(entidades.Fecha);
 
                    cli.RegPedidos(entidades);
                    dgvPclientes.Update();
                    LlenarGrid();
                    MessageBox.Show("Pedido Agregado Correctamente");
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
 


Lo que está en comentario son todas las formas que he intentado hacer que funcione. Les comento que un amigo me ayudó y me puso el código de manera que se guardaba la fecha.
Yo de bruto solo le dí a guardar el codigo y no me puse a analizarlo para entenderlo. Sucedio que estaba quitando codigos que no iba a utilizar que estaban en comentario y borre el codigo que me funcionaba, le di a guardar y apague la laptop. Cuando corrí de nuevo la aplicacion Boom, no tenia el codigo. :(.  

Si alguien me puede ayudar a entender cual es la forma correcta para que el datetimepicker se graba de manera correcta en mi base de datos se lo voy a agradecer mucho.

Disculpen todas las faltas ortograficas, mi teclado esta en ingles.

Gracias,


11-Aug-2014 22:15
Yordys Dominguez

Bueno ya encontré la solución yo mismo despues de depurar el programa miles de veces probando mil cosas distintas.

Solo tenia que declarar la Fecha como string en mi Entidad Pedidos y en el boton grabar
poner lo siguiente:

 
entidades.Fecha = datetimepicker.Text; // en mi caso dtpfecha1.Text;
 


y ya con eso aceptó grabar la fecha.

Espero si a alguien con este mismo problema que yo le sirva.




12-Aug-2014 20:17
Nacho Cabanes (+31)

Esa implementación puede tener un problema: si guardas las fechas como texto, quizá no puedas "comparar": las ordenaciones no serán correctas y será trabajoso hacer consultas como "obtener los datos del mes XX".

Según el gestor de bases de datos que uses, puede servir si al menos guardas las fechas en formato AAAA-MM-DD, que es el formato que muchos usando internamente. La otra alternativa es "Convert.ToDateTime", según el formato de fecha que use tu gestor de bases de datos.


13-Aug-2014 05:09
Yordys Dominguez

Hola Nacho.

Gracias por responder. Estoy de acuerdo contigo. Sé que no es la mejor manera de grabar fechas, pero sucede que es la unica que yo pude hacer funcionar debido a mi poco conocimiento en c# y sql. Es en este cuatrimestre que estoy empezando en C#.  Lo hice asi para poder mostrar el proyecto para poder pasar la materia. Muchos de mis compañeros optaron por usar un textbox que se tendrá que llenar a mano por no ponerse a investigar bien como hacerlo.

Yo de verdad quiero hacerlo con el Convert.ToDateTime pero te soy sincero, no se como, no se cual es el codigo correcto para que haga la conversion sin que me de error. Yo trate declarando la Fecha como datetime una vez en la base de datos y tambien declare en mi Entidad Pedidos el objeto Fecha como DateTime pero no supe como convertirlo, o si lo tenia que declarar como string o DateTime, me enrede ahi pero no me di por vencido y la solucion que puse fue la que logre hacer que grabara luego de 9 horas probando.

Me puedes dar tu opinion de como se hace la conversion para que yo pueda mejorarlo?

Gracias de nuevo.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)