none
insertar hora desde c# a sql server RRS feed

  • Pregunta

  • Buenas noches, 

    Tengo un formulario que tiene dos DateTimePiker  hora inicio y hora fin con el  Format en time, por defecto cuando se abre el formulario a parecen con la hora  3:40:00 los dos así esta definido en el value 

    Al guardar los datos guarda todo bien, pero la hora inicio y la hora fin no guarda la hora ingresada por el usuario, si no que en los dos capos guarda la hora 3:40:00 la que esta ahí en el formulario mas no la que yo modifico es decir así ponga que son las 8:30:00 el me guarda las 3:40:00

    los campos donde guarda los datos en sql server son tipo time

    Codigo 

    private DateTime HInicio;
    private DateTime HFin;
    public DateTime HInicio1 { get => HInicio; set => HInicio = value; }        
    public DateTime HFin1 { get => HFin; set => HFin = value; }

    private void BtnGuardar_Click(object sender, EventArgs e)
            {
                if (operacion == "Insertar")
                {
                    objetask.DocRefeA1 = txtReferencia.Text;
                    objetask.NomActivi1 = txtActividad.Text;
                    objetask.CodTareas1 = Convert.ToInt32(cmbTarea.SelectedValue);
                    objetask.CodTipo1 = Convert.ToInt32(cmbTipo.SelectedValue);
                    objetask.CodPrio1 = Convert.ToInt32(cmbPrioridad.SelectedValue);
                    objetask.CodEstad1 = Convert.ToInt32(cmbEstado.SelectedValue);
                    objetask.CodResp1 = Convert.ToInt32(cmbResponsable.SelectedValue);
                    objetask.FCreacion1 = Convert.ToDateTime(dateCreacion.Value);
                    objetask.FInicio1 = Convert.ToDateTime(dateInicio.Value);
                    objetask.FFin1 = Convert.ToDateTime(dateFin.Value);
                    objetask.HInicio1 = Convert.ToDateTime(dateInicio.Value);
                    objetask.HFin1 = Convert.ToDateTime(dateFin.Value);
                    objetask.CodComplet1 = Convert.ToInt32(cmbCompletado.SelectedValue);
                    objetask.Notas1 = txtNotas.Text;
                    objetask.InsertarActividad();
                    MessageBox.Show("Insertado correctamente");
                    this.Close();
                }
                else if (operacion == "Editar")
                {
                    objetask.CodActi1 = Convert.ToInt32(CodActi);
                    objetask.DocRefeA1 = txtReferencia.Text;
                    objetask.NomActivi1 = txtActividad.Text;
                    objetask.CodTareas1 = Convert.ToInt32(cmbTarea.SelectedValue);
                    objetask.CodTipo1 = Convert.ToInt32(cmbTipo.SelectedValue);
                    objetask.CodPrio1 = Convert.ToInt32(cmbPrioridad.SelectedValue);
                    objetask.CodEstad1 = Convert.ToInt32(cmbEstado.SelectedValue);
                    objetask.CodResp1 = Convert.ToInt32(cmbResponsable.SelectedValue);
                    objetask.FCreacion1 = Convert.ToDateTime(dateCreacion.Value);
                    objetask.FInicio1 = Convert.ToDateTime(dateInicio.Value);
                    objetask.FFin1 = Convert.ToDateTime(dateFin.Value);
                    objetask.HInicio1 = Convert.ToDateTime(dateInicio.Value);
                    objetask.HFin1 = Convert.ToDateTime(dateFin.Value);
                    objetask.CodComplet1 = Convert.ToInt32(cmbCompletado.SelectedValue);
                    objetask.Notas1 = txtNotas.Text;
                    objetask.ActualizarActividad();
                    MessageBox.Show("Se edito correctamente");
                    this.Close();
                }
            }


    acá capturo el procedimiento almacenado los capos HInicio y HFin tinen definido un TimeOfDay

    public void InsertarActividad()
            {
                using (var connection = GetConnection())
                {
                    connection.Open();
                    using (var command = new SqlCommand())
                    {
                        command.Connection = connection;
                        command.CommandText = "InsertarActividad";
                        command.CommandType = CommandType.StoredProcedure;
                        command.Parameters.AddWithValue("@DocRefeA", DocRefeA);
                        command.Parameters.AddWithValue("@NomActivi", NomActivi);
                        command.Parameters.AddWithValue("@Codtareas", CodTareas);
                        command.Parameters.AddWithValue("@codtipo", CodTipo);
                        command.Parameters.AddWithValue("@codprio", CodPrio);
                        command.Parameters.AddWithValue("@codestad", CodEstad);
                        command.Parameters.AddWithValue("@codresp", CodResp);
                        command.Parameters.AddWithValue("@fcreacion", FCreacion);
                        command.Parameters.AddWithValue("@finicio", FInicio);
                        command.Parameters.AddWithValue("@ffin", FFin);
                        command.Parameters.AddWithValue("@HInicio", HInicio.TimeOfDay);
                        command.Parameters.AddWithValue("@HFin", HFin.TimeOfDay);
                        command.Parameters.AddWithValue("@CodComplet", CodComplet);
                        command.Parameters.AddWithValue("@Notas", Notas);
                        command.ExecuteNonQuery();
                        command.Parameters.Clear();
                    }
                }
            }

    Como insertar la hora que yo elija mas no la que tiene el DateTimePiker ¿?


    sábado, 22 de junio de 2019 2:27

Todas las respuestas

  • El problema está en la llamada que haces TimeOfDay. Eso no devuelve la hora, sino que devuelve un valor de tipo TimeStamp que contiene el intervalo de tiempo transcurrido desde la media noche. Si le metes un TimeSpan a un parámetro de SqlServer, vete a saber qué diablos está interpretando el servidor, dado que no existe en SqlServer un tipo de dato equivalente al TimeSpan.

    Pásale la hora, por ejemplo, en forma de string en un formato que SQL Server sepa convertir a Time.

    command.Parameters.AddWithValue("@HFin", HFin.ToString("HH:MM:ss"));

    También puedes probar pasando directamente el DateTime. Si el campo es Time en la base de datos, en principio debe despreciar la parte de fecha y quedarse solo con la hora del DateTime:

    command.Parameters.AddWithValue("@HFin", HFin);

    Por cierto, aunque no guarda relación con lo anterior, es bastante inútil el código que pones donde haces esto: Convert.ToDateTime(dateFin.Value); Dado que el .Value del dateFin ya es de tipo DateTime, no sirve para nada aplicarle un Convert que lo convierta a DateTime.

    sábado, 22 de junio de 2019 6:05
    Moderador
  • Hice lo que usted dijo y sigue guardando la hora del DateTimePiker puedo poner cualquier hora y guarda la hora  3:40
    sábado, 22 de junio de 2019 17:50
  • Entonces es el momento de usar el Debugger. Hay que ejecutar el código paso-a-paso desde Visual Studio examinando las variables a cada paso hasta ver cuál es el punto exacto en el que se pierde el valor.

    Si todo es correcto hasta llegar al punto en el que se pasa el parámetro al procedimiento almacenado, entonces se activa una captura con el Profiler de SQL Server, a ver qué es lo que realmente se está enviando.

    Si el valor enviado es correcto, entonces puede haber un problema dentro del propio procedimiento almacenado. Para depurarlo, usamos la ejecución paso-a-paso desde SSMS, iniciando la ejecución del procedimiento mediante la misma sentencia que se envió desde el cliente y que podemos copiar y pegar desde el Profiler a SSMS.

    sábado, 22 de junio de 2019 19:40
    Moderador
  • Hola Alberto, muchas gracias lo pude solucionar  efectivamente haciendo un paso a paso encontré que estaba enviando los datos trucados ya funciona perfectamente muchas gracias  
    sábado, 22 de junio de 2019 19:58