none
Permitir guardar valor null en datetime y en campo "Image" RRS feed

  • 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
    sábado, 26 de mayo de 2012 17:48

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
    domingo, 27 de mayo de 2012 16:25
    Moderador

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

    domingo, 27 de mayo de 2012 5:38
    Moderador
  • 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 random

    cmd.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.

    domingo, 27 de mayo de 2012 15:33
  • 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
    domingo, 27 de mayo de 2012 16:25
    Moderador
  • 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

    domingo, 27 de mayo de 2012 21:08