Principales respuestas
Permitir guardar valor null en datetime y en campo "Image"

Pregunta
-
Que tal
Mi problema es que tengo un metodo para poder guardar una imagen y ya todo bien hasta ahi, pero el problema es que si alguien no quiere guardar una imagen el comando no funciona, al igual si alguien no pone una fecha no permite valores null en la fecha.
Datos adicionales: La imagen se sube a una base de datos en la tabla "AGENTES" y para poder guardarla se autogenera un ID autonumerico.
Entonces como puedo modificar el codigo o poner una condicion de que si no hay nada en ese campo de fecha que se ponga un valor cualquiera en datetime, al igual en la imagen como poder lograr que si no hay imagen que subir se pueda guardar el registro sin tener error de que no hay imagen ni fecha.
Aqui esta el codigo:
Dim FechaNacim As String = datepicker.Text.ToString() 'codigo de cambio de tamaño de imagen al subir If FileUpload1.PostedFile IsNot Nothing AndAlso FileUpload1.PostedFile.FileName <> "" Then Dim imageToBeResized As System.Drawing.Image = System.Drawing.Image.FromStream(FileUpload1.PostedFile.InputStream) Dim imageHeight As Integer = imageToBeResized.Height Dim imageWidth As Integer = imageToBeResized.Width Dim maxHeight As Integer = 250 Dim maxWidth As Integer = 200 imageHeight = (imageHeight * maxWidth) \ imageWidth imageWidth = maxWidth If imageHeight > maxHeight Then imageWidth = (imageWidth * maxHeight) \ imageHeight imageHeight = maxHeight End If Dim bitmap As New Bitmap(imageToBeResized, imageWidth, imageHeight) Dim stream As System.IO.MemoryStream = New MemoryStream() bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg) stream.Position = 0 Dim imageSize As Byte() = New Byte(stream.Length) {} stream.Read(imageSize, 0, imageSize.Length) ' Crear conexion Dim con As New SqlConnection(dsDatos.ConnectionString) ' Create comando sql Dim cmd As New SqlCommand() cmd.CommandText = "INSERT INTO AGENTES (NUM_LICENCIA, TIPO_LICENCIA, NOMBRE, APE_PAT, APE_MAT, FECHA_NACIM, RFC, CALLE, NUM_EXTERIOR, NUM_INTERIOR, COLONIA, MUNICIPIO, CIUDAD, ESTADO, PAIS, COD_POSTAL, TEL_OFICINA, TEL_SEGUNDO, TEL_EXTENSION, CELULAR, EMAIL, SEXO, USUARIO, CONTRASEÑA, NOMBREIMAGEN, IMAGEN) VALUES( @num_licencia, @tipo_licencia, @nombre, @ape_pat, @ape_mat, @fecha_nacim, @rfc, @calle, @num_exterior, @num_interior, @colonia, @municipio, @ciudad, @estado, @pais, @cod_postal, @tel_oficina, @tel_segundo, @tel_extension, @celular, @email, @sexo, @usuario, @contraseña, @nombreimagen, @imagen)" cmd.CommandType = CommandType.Text cmd.Connection = con 'Se declaran los parametros por separado, solo pongo de muestra los que me dan error que es valores de fecha y de imagen Dim FecNac As New SqlParameter("@fecha_nacim", SqlDbType.DateTime) FecNac.Value = FechaNacim.ToString() cmd.Parameters.Add(FecNac) Dim UploadedImage__2 As New SqlParameter("@imagen", SqlDbType.Image, imageSize.Length) UploadedImage__2.Value = imageSize cmd.Parameters.Add(UploadedImage__2) con.Open() Dim result As Integer = cmd.ExecuteNonQuery() con.Close() If result > 0 Then Label1.Text = "Registro creado" End If End If
Gracias de antemano.
- Editado Kokinho3 sábado, 26 de mayo de 2012 19:59 falta de datos
Respuestas
-
Está mal usado, creo yo. No sé qué tipo de variable es FechaNacim, pero los DBNull.Value suelen usarse únicamente en valores para SqlParameters o cuando se comparan datos leídos de la base de datos. Por ejemplo, cuando va a insertar un valor, uno usa DBNull.Value si el valor de una columna no es conocido. Así entonces será nulo en la base de datos.
Para tratar de aclararle más el panorama, FechaNacim es probablemente de tipo DateTime. Pues en base de datos las fechas pueden ser nulas, pero en .net no. Entonces .Net trajo al mundo los tipos Nullable<T>. Ahora puede tener un Nullable<DateTime> para representar en .net una fecha nula apropiadamente. Le recomiendo que use este tipo de datos. También puede declararse con un signo de pregunta: DateTime?.
Entonces, asumiendo que se usa un DateTime?, podemos escribir un ejemplo:
//Asumo que hay un textBox, por cuestiones de sencillez: DateTime? fechaNacim = null; //Valor por defecto. if (String.IsNullOrWhitespace(textbox1.Text)) { //El texto está vacío. Dejamos la variable intacta, o sea nula. } else { //Convertimos el texto a fecha: fechaNacim = DateTime.Parse(textbox1.Text); } //Listo: Ahora fechaNacim contiene una fecha válida o es nula. //Para grabar en base de datos se transforma el nulo a DBNull.Value. ... SqlParameter FecNac = new SqlParameter("FechaNacimiento", SqlDbType.DateTime); if (fechaNacim == null) { //Ok, fecha nula. Usar DBNull.Value para la inserción en base de datos: FecNac.Value = DBNull.Value; } else { FecNac.Value = fechaNacim; } ...
Lo siento, no programo en VB así que el ejemplo es C#.
Jose R. MCP
- Marcado como respuesta Kokinho3 domingo, 27 de mayo de 2012 21:07
Todas las respuestas
-
En SQL Server usted debe marcar los campos como opcionales (que permitan nulos). Después de eso, cuando vaya a insertar un registro, utilice el valor especial DBNull.Value cada vez que necesite insertar un nulo en alguno de los campos opcionales.
Jose R. MCP
-
Gracias por tu respuesta Jose, efectivamente tengo permitir valores null en datetime, pero la forma en que uso el comando no se como aplicarlo.
Dim FecNac As New SqlParameter("@fecha_nacim", SqlDbType.DateTime) If(FechaNacim is Dbnull.Value)
FecNac.Value = "01/01/1900" 'Fecha randomcmd.Parameters.Add(FecNac) else
FecNac.Value = FechaNacim.ToString()
cmd.Parameters.Add(FecNac)
End If
LA verdad es que no se como utilizar el DbNull en un parametro.
-
Está mal usado, creo yo. No sé qué tipo de variable es FechaNacim, pero los DBNull.Value suelen usarse únicamente en valores para SqlParameters o cuando se comparan datos leídos de la base de datos. Por ejemplo, cuando va a insertar un valor, uno usa DBNull.Value si el valor de una columna no es conocido. Así entonces será nulo en la base de datos.
Para tratar de aclararle más el panorama, FechaNacim es probablemente de tipo DateTime. Pues en base de datos las fechas pueden ser nulas, pero en .net no. Entonces .Net trajo al mundo los tipos Nullable<T>. Ahora puede tener un Nullable<DateTime> para representar en .net una fecha nula apropiadamente. Le recomiendo que use este tipo de datos. También puede declararse con un signo de pregunta: DateTime?.
Entonces, asumiendo que se usa un DateTime?, podemos escribir un ejemplo:
//Asumo que hay un textBox, por cuestiones de sencillez: DateTime? fechaNacim = null; //Valor por defecto. if (String.IsNullOrWhitespace(textbox1.Text)) { //El texto está vacío. Dejamos la variable intacta, o sea nula. } else { //Convertimos el texto a fecha: fechaNacim = DateTime.Parse(textbox1.Text); } //Listo: Ahora fechaNacim contiene una fecha válida o es nula. //Para grabar en base de datos se transforma el nulo a DBNull.Value. ... SqlParameter FecNac = new SqlParameter("FechaNacimiento", SqlDbType.DateTime); if (fechaNacim == null) { //Ok, fecha nula. Usar DBNull.Value para la inserción en base de datos: FecNac.Value = DBNull.Value; } else { FecNac.Value = fechaNacim; } ...
Lo siento, no programo en VB así que el ejemplo es C#.
Jose R. MCP
- Marcado como respuesta Kokinho3 domingo, 27 de mayo de 2012 21:07
-
Excelente justo lo que necesitaba, no importa que no haya sido en VB tengo un poco de experiencia en C# y gracias a tu solución he podido guardar valor nulo de fecha y también hice las pruebas convenientes a la hora de mostrar y modificación y no me mostró ningún error.
Muchas gracias webJose