Introducir valores NULL en SQL Server desde C#

Si utilizas SQL Server como sistema de gestión de bases de datos puede que te hayas encontrado alguna vez en la necesidad de utilizar tablas que pueden contener valores null. Generar registros a través del MMC haciendo que esos campos tomen valor null se basa únicamente en no introducir nada en su celda, pero ¿cómo se hace esto cuando estamos programando por ejemplo, una aplicación web?

Una posible solución sería la de no rellenar esa columna en el SQL de inserción, pero aparte de no ser demasiado elegante, seguimos teniendo el problema, ¿qué hacemos si queremos actualizar el registro para pasar un valor de no nulo a nulo?.

En el sigueinte ejemplo se muestra un pequeño fragmento de código en el que se utiliza un comando SQL para insertar un registro en una tabla ficticia de usuarios, formada por una columna para el nombre y otra para una fecha. Dicha tabla se supone creada de forma que la columna de fecha puede aceptar valores nulos.

 
string query = "INSERT INTO personas( nombre, fecha ) VALUES( @nombre, @fecha );"
 
SqlConnection sqlConnection = new SqlConnection("user id=sa;password=x;initial catalog=pruebas;data source=127.0.0.1;");
SqlCommand sqlCommand = new SqlCommand(query, sqlConnection);       
 
sqlCommand.Parameters.Add("@nombre", System.Data.SqlDbType.VarChar).Value = "Luke Sky Walker";
sqlCommand.Parameters.Add("@idCitaPrevia", System.Data.SqlDbType.DateTime).Value = System.Data.SqlTypes.SqlDateTime.Null;
 
sqlConnection.Open();
 
try{            
   sqlCommand.ExecuteNonQuery(); 
}
catch(Exception exc){
   throw new Exception("Error al insertar datos", exc);
}
finally{
   sqlConnection.Close();
}

Como puede verse en el código se utiliza un parámetro para el campo fecha rellenándolo con un valor nulo, de la forma System.Data.SqlTypes.SqlDateTime.Null. Si la columna fuera de otro tipo, por ejemplo un entero, utilizaríamos System.Data.SqlTypes.Int32.Null. Cada tipo dispone de su propia propiedad que devuelve un valor nulo.

Referencias:

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

16 Respuestas para “Introducir valores NULL en SQL Server desde C#”

  1. Tan simple, tan simple y sin embargo me salvaste la vida, con tu ejemplo, gracias Patxi Echarte

  2. Geovanny Fonseca 28. Feb, 2007 en 11:37 pm

    Estoy desarrollando un proyecto y dentro de los requerimientos tengo un formulario para controlar las fechas que toma ciertos procesos, resulta que la mayoria son campos de tipo Datetime en la base de datos sql server 2005. Los cuales permiten valores nulos, agregue en el formulario una validación del formulario y verifico si el texto = «» entonces que haga el cambio tal y como lo indicas, sin embargo en mi caso lo que me pone es la siguiente fecha 1/1/1900.
    Como puedo hacer para evitar esto.

  3. Hola Geovanny, si metes un valor null en el campo no deberías recuperar esa fecha. Comprueba que tengas bien la condición del if y que tengas correctamente configurada la columna para aceptar nulos.

  4. Geovanny Fonseca 01. Mar, 2007 en 5:11 pm

    Buenos días Patxi, gracias por tu respuesta, voy a explicarme mejor.

    El sistema esta separado por capas, en la capa de logica de negocio,utilizo procedmientos almacenados, los cuales tienen definidos los parametros que reciben.

    La capa de presentación es con WebForm.

    Del formulario cargo la clase con los valores indicados en el WebForm.

    Ya hice una prueba si dentro de los parametros que envio al procedimiento almacenado utilizo el Data.SqlTypes.SqlDateTime.Null directamente, para asignar nulo a una fecha, me los respeta, y dentro de la table el valor queda como nulo.

    Pero en mi caso la carga de los parametros debe ser atravez de los atributos de la clase, antes de guardar el valor del atributo de la clave verifico si el dato que recibi desde el formulario es una String vacio («»), si es así a la varible de tipo Date le asigno Data.SqlTypes.SqlDateTime.Null, y se la paso por parametro al procedimiento almacenado, sin embargo en ese momento lo que me asigna es una fecha ’01/01/1900′.

    He pasado ya 2 días completos buscando información en las páginas de Microsoft, articulos. Pero las soluciones que se indicán no funcionan.

    Si alguién ha tenido que pasar por esto y tiene respuesta al este problema, por favor indicar como lo resolvió.

  5. Hola geovanny, por pura casualidad encontré tu consulta.

    La forma en que yo lo hago es declarar en la clase de negocios al campo fecha como

    DateTime? fecha;

    Asi se convierte en un tipo Nullable, entonces cuando detectas que la fecha debe ser nula, simplemente le asignas el valor nulo asi:

    fecha = null;

    y ya, cuando le pasas ese parámetro al SP, tendrás un valor nulo en tu tabla.

    Saludos

  6. Es cierto lo que dice J. Marcos Troncoso, en la capa de negocio en el procedure se declara la variable como DateTime? y al enviar ya se puede utilizar el null.

    Bye

  7. Hola q tal gente, me parece muy interesante esta opcion de insercion.

    Estoy desarrollando una aplicacion sobre biometria, y me tope con un gran problema, el control unicamente me permite guardar datos secuencialmete, (los datos son de tipo Byte()) y tengo una tabla con la biometria de los 10 dedos que es lo razonable, no me interesa ya lo controle si un usuario no tiene dedo, se debe de registrar null, mi pregunta es.
    Una vez que ya realizo el registro del primer dedo, los demas campos estan vacios, para el segundo dedo hago un SP
    de la sig manera
    CREATE PROC..[].[]
    (
    @ID int
    )
    insert into DECADACTILAR
    (DECAdEDOiNDICEdERECHO)
    SET(@DECAid)
    WHERE (ID= @ID)
    PERO ESTE ES EL SEGUNDO CAMPO, YA NO QUIERO QUE SE GENERE NUEVAMENTE LA CLAVE PRINCIPAL, SINO QUE SE REGISTREN DATOS EN EL SEGUNDO CAMPO, Y ASY SUCESIVAMENTE HASTA LLEGAR AL ULTIMO REGISTRO. Por ejem:
    id idPersona DecaDedoPulgDer decaDedoIndDer
    1 3 ******* NULL
    id = clave primaria se genera automaticamente
    idPersona = clave foranea que la traigo de otra Tabla para la relacion.
    DecaDedoPulgDer = Donde se almacena la biometria.

    en el campo que esta null ahi se tiene que registrar el nuevo dato, lo que sucede como te explique anteriormente, el control de las Huellas dactilares, solo me permite registrar uno a la vez, el sistema esta hecho en N capas. Este paso lo necesito para evitar de hacer varias tablas en las cuales voy a registrar la biometria, esto es la ultima solucion que tengo, y eso no SE DEBE DE HACER.

    Tengo metodos para cada dedo de busqueda e insercion

    Gracias de Antemano

  8. Hola Francisco, no sé si termino de entender lo que me planteas, pero si no me equivoco, lo que tendrías que hacer es la primera vez que guardas información de un dedo crear el registro tal como lo haces ahora. Para el resto de dedos sin embargo tendrías que realizar un update. No sé cómo tienes montada la lógica de la aplicación, pero lo podrías hacer bien en el propio programa o en el SP, comprobando en un primer paso si hay información para el paciente. Si no la hay, tendrías que hacer el insert, si la hay, un update del campo que corresponda.

  9. Bueno Señores sus comentarios son validos, pero puedes utilizar la expresion System.DBNull.Value, y este te coloca un valor nulo para cualquier tipo de datos de SQL Server

  10. Muy buenas aportaciones Sres. Gracias.

  11. Gracias por la ayuda …
    Por si esto no le sirviera a alguien por alguna razon …
    solo que puede estar pasando (como en mi kso), es que en el Store Procedure no abran puesto la Opcion del Set «nocount on» porq a la hora de devolver un valor la ejecucion no regresa 0 o 1 sino el numero de lineas que cuenta..
    Espero q a alguien le sirva esto …
    GRAcias

  12. Excelente esta bien explicado el ejemplo gracias por compartir el conocimiento.

  13. Estimados al intentar insertar este tipo System.Data.SqlTypes.SqlInt32.Null a un campo de tipo int que permite valores null en sql server 2005 me arroja el siguiente error: «Error de inserción: el nombre de columna o los valores especificados no corresponden a la definición de la tabla.». Al intentar con el tipo System.DBNull.Value me arroja el mismo mensaje de error

  14. AlexanderLuis 22. Sep, 2010 en 5:25 pm

    Saludos,

    Mil gracias a todos, en especial a Georgy.NET, necesitaba guardar un valor null en un campo fecha/hora en Access desde C# utilizando OleDb, y la expresión System.DBNull.Value funcionó a la perfección. Muchas gracias…

  15. John Rodriguez 12. Oct, 2011 en 11:57 pm

    Muy bien me sirvió de mucho…

  16. Tengo una tabla en SQL Server 2005, en la cual contiene un campo llamado Direccion, es un campo null, pero si uno no inserta datos, quiero que me inserte el siguiente texto: N/A
    Como se hace…..
    Gracias