locked
Insertar campos vacios de un datagridview en un campo DateTime de una tabla en sql RRS feed

  • Pregunta

  • Hola Buenas Tardes

    Antes que nada un agradecimiento por tomarse el tiempo de leer.

    Les comento, llevo dias batallando con un problema que presento al momento de querer insertar registros de un datagridview a una tabla de sql, ya que en este datagridview existen campos de fechas en los cuales algunos no tienen datos y al momento de realizar la insercción a la tabla en sql, no me deja por esos campos vacios. Los campos son: Checada_Entrada, Checada_SalidaC, Checada_EntradaC y Checada_Salida. Si defino estos campos en la BD como nvarchar y en la insercción realizo el Convert.ToString si me guarda los registros sin problemas, pero yo necesito guardarlos en tipo DateTime para realizar operaciones posteriores.

    Si alguien pudiera orientarme, para saber que estoy haciendo mal o que tipo de función u otra opción podria aplicar, les agradeceria el dato.

    Este es un extracto de mi codigo de insercción

    Dim insert As SqlCommand = New SqlCommand("insert into Datos_Reloj values (@Clave_Empleado, @Checada_Entrada,@Checada_SalidaC,@Checada_EntradaC, @Checada_Salida, @Fecha_Inicio, @Fecha_Termino)", conexion)
    Try
    Dim fila As DataGridViewRow = New DataGridViewRow()
    For Each fila In DGridImportar.Rows

    insert.Parameters.Clear()
    insert.Parameters.AddWithValue("@Clave_Empleado", Convert.ToString(fila.Cells("Clave empleado").Value))
    insert.Parameters.AddWithValue("@Checada_Entrada", Convert.ToDateTime(fila.Cells("Checada entrada").Value))
    insert.Parameters.AddWithValue("@Checada_SalidaC", Convert.ToDateTime(fila.Cells("Checada al salir de comer").Value))
    insert.Parameters.AddWithValue("@Checada_EntradaC", Convert.ToDateTime(fila.Cells("Checada entrar a comer").Value))
    insert.Parameters.AddWithValue("@Checada_Salida", Convert.ToDateTime(fila.Cells("Checada salida").Value))
    insert.Parameters.AddWithValue("@Fecha_Inicio", TxtFechaImportar1.Text)
    insert.Parameters.AddWithValue("@Fecha_Termino", TxtFechaImportar2.Text)
    insert.ExecuteNonQuery()
    Next
    MsgBox("Datos agregados correctamente", MsgBoxStyle.Information, "Operación Exitosa")
    miércoles, 10 de agosto de 2016 16:17

Respuestas

  • "DAQL" escribió:

    > al momento de querer insertar registros de un datagridview a una tabla de sql, ya que
    > en este datagridview existen campos de fechas en los cuales algunos no tienen datos y
    > al momento de realizar la insercción a la tabla en sql, no me deja por esos campos vacios.

    Hola:

    Si los valores de las celdas del control DataGridView correspondientes a las fechas son Nothing o DBNull.Value, tendrás que especificar un valor NULL para que se inserte en el correspondiente campo de la tabla, suponiendo que dichos campos admitan valores NULL en la tabla, claro está.

    Inserta en algún Module de tu proyecto la siguiente función:

    Friend Module NombreModulo
    
        Public Function IsNothingOrDbNullValue(value As Object) As Boolean
            ' La función devolverá True si el valor es Nothing o DBNull.Value,
            ' devolviendo False en caso contrario.
            Return ((value Is Nothing) OrElse (value Is DBNull.Value))
        End Function
    
    End Module


    Y a la hora de especificar los valores de los parámetros correspondientes a las fechas, ejecutarías lo siguiente:

        Dim value As Object = fila.Cells("Checada entrada").Value
        insert.Parameters.AddWithValue("@Checada_Entrada", If(IsNothingOrDbNullValue(value), DBNull.Value, value))
    
        value = fila.Cells("Checada al salir de comer").Value
        insert.Parameters.AddWithValue("@Checada_SalidaC", If(IsNothingOrDbNullValue(value), DBNull.Value, value))
    
        value = fila.Cells("Checada entrar a comer").Value
        insert.Parameters.AddWithValue("@Checada_EntradaC", If(IsNothingOrDbNullValue(value), DBNull.Value, value))
    
        value = fila.Cells("Checada salida").Value
        insert.Parameters.AddWithValue("@Checada_Salida", If(IsNothingOrDbNullValue(value), DBNull.Value, value))

    Asumo que el control DataGridView lo tienes enlazado con un objeto DataTable. Si no es así, entonces tendrás que hacer una conversión explícita de String a DateTime:

    En los cuatro parámetros especificarías la función If como indico a continuación:

    insert.Parameters.AddWithValue("@Checada_Entrada", If(IsNothingOrDbNullValue(value), CObj(DBNull.Value), CDate(value)))

    Ni que decir tiene que si el valor alfanumérico no se puede convertir a DateTime, obtendrás la oportuna excepción.

    Así que será mejor que tengas enlazado el control DataGridView con un objeto DataTable para no tener que ejecutar muchas conversiones. ;-)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 10 de agosto de 2016 16:37
    Moderador

Todas las respuestas

  • Mira aqui hay un ejemplo de como le puedes hacer declarando un tipo Nullable<T>.Esta explicado.

    No se si te sirva

    MSDN EJEMPLO


    miércoles, 10 de agosto de 2016 16:30
  • Hola DAQL,

    [-] ... al momento de realizar la insercción a la tabla en sql, no me deja por esos campos vacios

    Pero si estás declarando la columna con tipo DateTime, este no permite valores vacíos, ya que estos son de tipo cadena (varchar), si no deseas agregar valor al campo debes asignar el valor NULLO, por lo que tu columna deberá aceptarlos.

    Y cuando envíes el valor mediante Vb.Net :

    ....AddWithValue("@Fecha1", DBNull.Value)

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    miércoles, 10 de agosto de 2016 16:31
  • "DAQL" escribió:

    > al momento de querer insertar registros de un datagridview a una tabla de sql, ya que
    > en este datagridview existen campos de fechas en los cuales algunos no tienen datos y
    > al momento de realizar la insercción a la tabla en sql, no me deja por esos campos vacios.

    Hola:

    Si los valores de las celdas del control DataGridView correspondientes a las fechas son Nothing o DBNull.Value, tendrás que especificar un valor NULL para que se inserte en el correspondiente campo de la tabla, suponiendo que dichos campos admitan valores NULL en la tabla, claro está.

    Inserta en algún Module de tu proyecto la siguiente función:

    Friend Module NombreModulo
    
        Public Function IsNothingOrDbNullValue(value As Object) As Boolean
            ' La función devolverá True si el valor es Nothing o DBNull.Value,
            ' devolviendo False en caso contrario.
            Return ((value Is Nothing) OrElse (value Is DBNull.Value))
        End Function
    
    End Module


    Y a la hora de especificar los valores de los parámetros correspondientes a las fechas, ejecutarías lo siguiente:

        Dim value As Object = fila.Cells("Checada entrada").Value
        insert.Parameters.AddWithValue("@Checada_Entrada", If(IsNothingOrDbNullValue(value), DBNull.Value, value))
    
        value = fila.Cells("Checada al salir de comer").Value
        insert.Parameters.AddWithValue("@Checada_SalidaC", If(IsNothingOrDbNullValue(value), DBNull.Value, value))
    
        value = fila.Cells("Checada entrar a comer").Value
        insert.Parameters.AddWithValue("@Checada_EntradaC", If(IsNothingOrDbNullValue(value), DBNull.Value, value))
    
        value = fila.Cells("Checada salida").Value
        insert.Parameters.AddWithValue("@Checada_Salida", If(IsNothingOrDbNullValue(value), DBNull.Value, value))

    Asumo que el control DataGridView lo tienes enlazado con un objeto DataTable. Si no es así, entonces tendrás que hacer una conversión explícita de String a DateTime:

    En los cuatro parámetros especificarías la función If como indico a continuación:

    insert.Parameters.AddWithValue("@Checada_Entrada", If(IsNothingOrDbNullValue(value), CObj(DBNull.Value), CDate(value)))

    Ni que decir tiene que si el valor alfanumérico no se puede convertir a DateTime, obtendrás la oportuna excepción.

    Así que será mejor que tengas enlazado el control DataGridView con un objeto DataTable para no tener que ejecutar muchas conversiones. ;-)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 10 de agosto de 2016 16:37
    Moderador