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