Pregunta sobre valores NULL en Visual Basic

sebip
13 de Marzo del 2005
Hola

Tengo una pregunta sobre valores NULL en código Visual Basic. A quien me pueda responder. De antemano doy las gracias.

Supongamos que tenemos una tabla de empleados que tiene los siguientes campos: Identificador de empleado, nombre, fecha de alta en la empresa y departamento de la empresa al que pertenece. Todos los campos de esta tabla son requeridos (obligatorios) excepto el campo de departamento ya que un empleado puede, o no, pertenecer a un departamento de la empresa.

En el código Visual Basic expuesto (ver código al final del presente texto) pretendemos insertar un registro en la tabla de empleados. Informamos todos los campos del registro excepto el departamento. Al ejecutar el comando vemos que se ha insertado el registro pero en el campo "Departamento" se ha insertado el valor 0 (cero) cuando en realidad queriamos que dicho campo estuviese vacio (con valor NULL).

Según la documentación que he consultado esto ocurre porque las variables de tipo "Integer" toman por defecto el valor 0 (cero) y si no se les asigna un valor durante la ejecución mantienen ese valor. Pero a un Integer no le se puede asignar el valor NULL.

¿Cual sería la solución?.

¿Cual es el método en Visual Basic para que una variable pueda aceptar valores NULL?.

¿Tendriamos que definir el campo "Departamento" como Variant, que si que acepta valor NULL?. En este caso ¿el tipo Variant es más lento?.

¿Podriamos definir el campo "Departamento" como String y asignar le cadena vacia ("")?

¿O rediseñar el código para que crease la sentencia INSERT dinamicamente?. Es decir crear la cadena "INSERT INTO Empleados (id_empleado, nombre, fecha_alta, id_departamento) VALUES(" & r_empleado.id_empleado & ", " & Chr$(34) & r_empleado.nombre & Chr$(34) & ", #" & CStr(r_empleado.fecha_alta) & "#, " & "NULL" & ")"

---| Código Visual Basic] |---

Public Type TEmpleado
id_empleado As Integer
nombreAs As String
fecha_alta As Date
id_departamento As Integer
End Type

Public Sub Main()

Dim oConexion As ADODB.Connection
Dim oComando As ADODB.Command
Dim oParametro1 As ADODB.Parameter
Dim oParametro2 As ADODB.Parameter
Dim oParametro3 As ADODB.Parameter
Dim oParametro4 As ADODB.Parameter
Dim r_empleado As TEmpleado

On Error Goto HaHabidoError:

' Creamos conexion ADO
Set oConexion = New ADODB.Connection
oConexion.Open "PROVIDER=MSDASQL;DSN=MIBASEDEDATOS;UID=;PWD=;"

'Creamos ADO Command, inicializamos y Cargamos parametros
Set oComando = New ADODB.Command

oComando.ActiveConnection = oConexion
oComando.CommandType = adCmdText
oComando.CommandText = "INSERT INTO Empleados (id_empleado, nombre, fecha_alta, id_departamento)" & _
"VALUES (?, ?, ?, ?)"

r_empleado.id_empleado = 46;
r_empleado.nombre = "Oscar de Leon"
r_empleado.fecha_alta = CDate(Format("01/01/2005", ""dd/MM/yyyy"))

'NO INFORMAMOS EL VALOR DE "r_empleado.id_departamento" YA QUE QUEREMOS QUE TENGA VALOR NULL

Set oParametro1 = oComando.CreateParameter("parametro_empleado", adInteger, adParamInput, 4, r_empleado.id_empleado)
oComando.Parameters.Append oParametro1
Set oParametro2 = oComando.CreateParameter("parametro_nombre", adVarChar, adParamInput, 100, r_empleado.nombre)
oComando.Parameters.Append oParametro2
Set oParametro3 = oComando.CreateParameter("parametro_fecha_alta", adDate, adParamInput, 10, r_empleado.fecha_alta)
oComando.Parameters.Append oParametro3
Set oParametro4 = oComando.CreateParameter("parametro_departamento", adInteger, adParamInput, 4, r_empleado.id_departamento)
oComando.Parameters.Append oParametro4

' Ejecutamos el comando
oComando.Execute , , adExecuteNoRecords

HaHabidoError:

On Error Resume Next

'Eliminamos objetos
Set oComando.ActiveConnection = Nothing
Set oComando = Nothing
Set oRs = Nothing
If oConexion.State <> adStateClosed Then
oConexion.Close
End If
Set oConexion = Nothing

End Sub