Introducir valores NULL en SQL Server desde C#
April 22nd, 2005Si 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:
delicious
menéame
fresqui

July 29th, 2006 a las 11:22 pm
Tan simple, tan simple y sin embargo me salvaste la vida, con tu ejemplo, gracias Patxi Echarte
February 28th, 2007 a las 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.
March 1st, 2007 a las 10:06 am
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.
March 1st, 2007 a las 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ó.
March 30th, 2007 a las 8:24 pm
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
June 12th, 2007 a las 5:43 am
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
August 29th, 2007 a las 6:01 pm
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
August 31st, 2007 a las 11:49 am
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.
October 10th, 2007 a las 8:54 am
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
April 29th, 2008 a las 1:55 am
Muy buenas aportaciones Sres. Gracias.