none
como manejar las fechas nulas en los dataset RRS feed

  • Pregunta

  • Hola a todos...., estoy haciendo un proyecto en capas y en mi capa de contrato tengo los dataset que serian la capa de transporte
    a los dataset los diseño uno por uno a mano sin utilizar el asistente de conexion a un origen de datos porque sino este me liga los dataset a una conexion y no quiero eso

    tengo por ejemplo un dataset para clientes(clientesDS) que tiene el datatable "clientes"
    mi datatable clientes tiene un campo fecha de baja y quiero que cuando se da de alta el cliente se grabe null en este campo

    el problema:
    el problema me aparece cuando en la capa de datos le assigo el valor de la fecha de baja que es nulo al aprametro fechabaja:
    Public Shared Sub Save(ByVal newCienteDs As ClienteDS)
            'TODO: llevar datarows en datatables a la base de datos
            Try
                Dim ct As IDatabaseContext = DataBaseFactory.Context
                Dim cmd As IDbCommand = ct.GetDBCommand(SPs.clientesAddOne.ToString())
                cmd.Parameters.Add(ct.CreateParameter("@idcliente", newCienteDs.Clientes.Item(0).IdCliente))
                cmd.Parameters.Add(ct.CreateParameter("@nombre", newCienteDs.Clientes.Item(0).Nombre))
                cmd.Parameters.Add(ct.CreateParameter("@razonsocial", newCienteDs.Clientes.Item(0).RazonSocial))
                cmd.Parameters.Add(ct.CreateParameter("@cuentanumero", newCienteDs.Clientes.Item(0).CuentaNumero))
                cmd.Parameters.Add(ct.CreateParameter("@direccion", newCienteDs.Clientes.Item(0).Direccion))
                cmd.Parameters.Add(ct.CreateParameter("@idlocalidad ", newCienteDs.Clientes.Item(0).IdLocalidad))
                cmd.Parameters.Add(ct.CreateParameter("@IdCondicionIva", newCienteDs.Clientes.Item(0).IdCondicionIva))
                cmd.Parameters.Add(ct.CreateParameter("@Email", newCienteDs.Clientes.Item(0).Email))
                cmd.Parameters.Add(ct.CreateParameter("@Sexo", newCienteDs.Clientes.Item(0).Sexo))
                cmd.Parameters.Add(ct.CreateParameter("@EstadoCliente", newCienteDs.Clientes.Item(0).EstadoCliente))
                cmd.Parameters.Add(ct.CreateParameter("@saldo", newCienteDs.Clientes.Item(0).saldo))
                cmd.Parameters.Add(ct.CreateParameter("@habilitacionctacte", newCienteDs.Clientes.Item(0).habilitacionctacte))
                cmd.Parameters.Add(ct.CreateParameter("@cuit", newCienteDs.Clientes.Item(0).cuit))
                cmd.Parameters.Add(ct.CreateParameter("@fechaalta", newCienteDs.Clientes.Item(0).fechaalta))
                cmd.Parameters.Add(ct.CreateParameter("@fechabaja", newCienteDs.Clientes.Item(0).fechabaja))
                cmd.CommandType = CommandType.StoredProcedure
                cmd.ExecuteNonQuery()
                'Catch ex As Exception
            Finally
            End Try
            
        End Sub
    porque se produce el error?:
    porque en la clase del dataset clientesDS, clientesRow para la propiedad fecha de baja hace la conversion a date y el valor nul oproduce el error y se meustra este mensaje en la interfaz:
       <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _
            Public Property fechabaja() As Date
                Get
                    Try 
                        Return CType(Me(Me.tableClientes.fechabajaColumn),Date)
                    Catch e As Global.System.InvalidCastException
                        Throw New Global.System.Data.StrongTypingException("El valor de la columna 'fechabaja' de la tabla 'Clientes' es DBNull.", e)
                    End Try
                End Get
                Set
                    Me(Me.tableClientes.fechabajaColumn) = value
                End Set
            End Property
    lo que yo quiero es oviar que se convierta el null a date

    Saludos y desde ya muchas gracias

    programador
    miércoles, 27 de mayo de 2009 14:12

Respuestas

  • Hola
    Lo que hiciste fue lo mismo que te puse, pero en mas lineas
    Si la respuesta es correcta, marcala como correcta.
    Tambien puedes votar como util si te fue de ayuda
    DCE 5 ESTRELLAS PLATINO
    miércoles, 27 de mayo de 2009 19:06

Todas las respuestas

  • hola,

    segun entiendo estas haciando usod e DataSet Tipados, si es asi prueba de seleccionar la columna que deberia tener null, y busc a en sus propiedades una de nombre "nillable", establecela en true.

    hasta donde se con eso deberia alcanzar.
    lo que si luego deberias validar si este campo contiene null cuando lo trabajajes, para ello comparalo con DBNull.Value.


    Aahh no espera tu quieres guardar un null, en ese caso deberias consultar el dato y pasarle a tu SP el valor de DBNull.Value
    algo asi:

    cmd.Parameters.Add(ct.CreateParameter("@fechabaja", DBNull.Value))


    saludos

    Leandro Tuttini

    Work: Iceberg Solutions
    Blog
    Buenos Aires
    Argentina
    miércoles, 27 de mayo de 2009 15:38
  • hola leandro, gracias por tu amabilidad, con lo que me dijsite pude solucionar cuando agrego un cliente  en mi metodo mandando como valor
    al parametro de la fecha de baja como null

    cmd.Parameters.Add(ct.CreateParameter(

    "@fechabaja", System.DBNull.Value))

    pero cuando ejecuto el metodo de actualizacion el cliente puede o no tener una fecha en ese campo entonces no puedo mandar directamente el null, sino tomar el valor que tiene een el dataset y actualizarlo pero cuando hace el get en la propiedad para la fechabaja da error porque no puede convertir si es nulo en date:

    Public Shared Sub Update(ByVal newCienteDs As ClienteDS)
            Try
                Dim ct As IDatabaseContext = DataBaseFactory.Context
                Dim cmd As IDbCommand = ct.GetDBCommand(SPs.clientesUpdate.ToString())
                cmd.Parameters.Add(ct.CreateParameter("@idcliente", newCienteDs.Clientes.Item(0).IdCliente))
                cmd.Parameters.Add(ct.CreateParameter("@nombre", newCienteDs.Clientes.Item(0).Nombre))
                cmd.Parameters.Add(ct.CreateParameter("@razonsocial", newCienteDs.Clientes.Item(0).RazonSocial))
                cmd.Parameters.Add(ct.CreateParameter("@cuentanumero", newCienteDs.Clientes.Item(0).CuentaNumero))
                cmd.Parameters.Add(ct.CreateParameter("@direccion", newCienteDs.Clientes.Item(0).Direccion))
                cmd.Parameters.Add(ct.CreateParameter("@idlocalidad ", newCienteDs.Clientes.Item(0).IdLocalidad))
                cmd.Parameters.Add(ct.CreateParameter("@IdCondicionIva", newCienteDs.Clientes.Item(0).IdCondicionIva))
                cmd.Parameters.Add(ct.CreateParameter("@Email", newCienteDs.Clientes.Item(0).Email))
                cmd.Parameters.Add(ct.CreateParameter("@Sexo", newCienteDs.Clientes.Item(0).Sexo))
                cmd.Parameters.Add(ct.CreateParameter("@EstadoCliente", newCienteDs.Clientes.Item(0).EstadoCliente))
                cmd.Parameters.Add(ct.CreateParameter("@saldo", newCienteDs.Clientes.Item(0).saldo))
                cmd.Parameters.Add(ct.CreateParameter("@habilitacionctacte", newCienteDs.Clientes.Item(0).habilitacionctacte))
                cmd.Parameters.Add(ct.CreateParameter("@cuit", newCienteDs.Clientes.Item(0).cuit))
                cmd.Parameters.Add(ct.CreateParameter("@fechaalta", newCienteDs.Clientes.Item(0).fechaalta))
                cmd.Parameters.Add(ct.CreateParameter("@fechabaja", newCienteDs.Clientes.Item(0).fechabaja))
                cmd.CommandType = CommandType.StoredProcedure
                cmd.ExecuteNonQuery()
                'Catch ex As Exception
            Finally
            End Try
            'Throw New NotImplementedException()
        End Sub

    Aca quiero asignarle a la fecha de baja el valor de  newCienteDs.Clientes.Item(0).fechabaja, que puede o no ser nulo y si esta en nulo cuando hace el get para leer el valor del campo fechabaja ahi es donde quiere trasformar el null a date y dispara el error ( el codigo que genera automaticamente en el designer del dataset clientesDS para la propiedad fechabaja es el que ejecuta el ctype del valor a date y si es nulo dispara el mensaje)

     
    este es el codigo automatico de la clase del dataset clientesds que lee el campo fechabaja

      <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _
            Public Property fechabaja() As Date
                Get
                    Try 
                        Return CType(Me(Me.tableClientes.fechabajaColumn),Date)
                    Catch e As Global.System.InvalidCastException
                        Throw New Global.System.Data.StrongTypingException("El valor de la columna 'fechabaja' de la tabla 'Clientes' es DBNull.", e)
                    End Try
                End Get
                Set
                    Me(Me.tableClientes.fechabajaColumn) = value
                End Set
            End Property

    en esta propiedad si es nul ono deberia hacer el ctype a date del valor nulo porque dispara el error pero no puedo hacerlo ahi porque es el codigo automatica de la clase dataset y no me doy cuenta donde puedo hacer eso

    saludos


    programador
    miércoles, 27 de mayo de 2009 17:46
  • Hola

    cmd.Parameters.Add(ct.CreateParameter(

     

    "@fechabaja", newCienteDs.Clientes.Item(0).isFechabajaNull()?System.DBNull.Value:newCienteDs.Clientes.Item(0).fechabaja))

    Saludos


    Si la respuesta es correcta, marcala como correcta.
    Tambien puedes votar como util si te fue de ayuda
    DCE 5 ESTRELLAS PLATINO
    miércoles, 27 de mayo de 2009 18:18
  • Hola Pedro gracias por tu aporte, lo pude solucionar asi:
    si tiene nulo le asigo al parametro un valor nulo, sino le assigno el valor del dataset de la tabla cliente campo fechabaja

     

    If newCienteDs.Clientes.Item(0).IsfechabajaNull Then
    	cmd.Parameters.Add(ct.CreateParameter("@fechabaja", System.DBNull.Value))
    Else
    	cmd.Parameters.Add(ct.CreateParameter("@fechabaja", newCienteDs.Clientes.Item(0).fechabaja))
    End If

     

     

    Asi no me produce el error en el get porque si es nulo directamente no hago el get de la propiedad fechabaja, ahora te hago una pregunta, debe haber alguna forma de sobreescribir la propiedad fechabaja para modificar el get y que no haga la conversion a date si el valor es nulo.


    programador
    miércoles, 27 de mayo de 2009 18:43
  • Hola
    Lo que hiciste fue lo mismo que te puse, pero en mas lineas
    Si la respuesta es correcta, marcala como correcta.
    Tambien puedes votar como util si te fue de ayuda
    DCE 5 ESTRELLAS PLATINO
    miércoles, 27 de mayo de 2009 19:06