Principales respuestas
Insertar campos vacios de un datagridview en un campo DateTime de una tabla en sql

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.
- Editado Enrique M. MontejoModerator miércoles, 10 de agosto de 2016 16:46
- Propuesto como respuesta Willams Morales miércoles, 10 de agosto de 2016 17:05
- Marcado como respuesta Enrique M. MontejoModerator jueves, 11 de agosto de 2016 14:47
miércoles, 10 de agosto de 2016 16:37Moderador
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
- Editado Misael Alanis miércoles, 10 de agosto de 2016 16:32
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 SImié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.
- Editado Enrique M. MontejoModerator miércoles, 10 de agosto de 2016 16:46
- Propuesto como respuesta Willams Morales miércoles, 10 de agosto de 2016 17:05
- Marcado como respuesta Enrique M. MontejoModerator jueves, 11 de agosto de 2016 14:47
miércoles, 10 de agosto de 2016 16:37Moderador