c# - validar - ¿Configurando el parámetro a DBNull.Value usando la sintaxis ternaria da error?
tipo de dato dbnull (4)
Anthony tiene razón, por lo que debería obtener la respuesta correcta, sin embargo, aquí hay un método de extensión porque estoy aburrido ...
public static object NullCheck(this string self)
{
return (string.IsNullOrEmpty(self)) ? (object)DBNull.Value : self;
}
uso en su escenario:
database.AddInParameter(cmd, "@description", DbType.String,
ilo.Description.NullCheck());
Tengo el siguiente bit de código para establecer un parámetro que se usará en una declaración INSERT para establecer una columna VARCHAR en una base de datos de SQL Server. Mi objeto de valor (llamado ilo) tiene una propiedad llamada Descripción que se inicializa en String.Empty, y luego se establece en un valor leído de XML, o si ese elemento XML está vacío, simplemente permanece como String.Empty.
Por lo tanto, cuando se inserta en la base de datos, si la propiedad aún está establecida en String.Empty, me gustaría que inserte un valor nulo.
database.AddInParameter(cmd, "@description", DbType.String,
(ilo.Description.Equals(string.Empty)) ?
DBNull.Value :
ilo.Description);
Básicamente, estoy diciendo que si ilo.Description es igual a string.empty, establezca el parámetro en DBNull.Value; de lo contrario, configúrelo en ilo.Description.
Esto da el siguiente error en Visual Studio ...
Error 141 El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre ''System.DBNull'' y ''cadena''
¿Por qué?
La parte curiosa es que puedo hacer lo siguiente sin error, ¡que debería ser exactamente lo mismo que usar la sintaxis condicional en línea como arriba!
if(ilo.Description.Equals(string.Empty))
{
database.AddInParameter(cmd, "@description", DbType.String, DBNull.Value);
}
else
{
database.AddInParameter(cmd, "@description", DbType.String, ilo.Description);
}
Busqué en otras publicaciones y encontré la siguiente, pero en realidad no responde mi pregunta.
EntLib forma de vincular valor "nulo" a parámetro
Estoy más interesado en ¿POR QUÉ, porque la solución obvia es usar una declaración if / else en lugar de la sintaxis en línea (ternaria)?
Hay una especie de respuesta en este enlace, pero me gustaría una mejor explicación porque me parece que es BS que esto no funciona; Yo lo llamaría un error!
Este es un error común que las personas reciben al usar el operador condicional. Para solucionarlo, simplemente convierta uno o ambos resultados a un tipo de base común.
ilo.Description.Equals(string.Empty)
? (object)DBNull.Value
: ilo.Description
El problema se revela en el mensaje de error que vio.
El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre ''System.DBNull'' y ''cadena''
Una cadena no es un DBNull, y una DBNull no es una cadena. Por lo tanto, el compilador no puede determinar el tipo de expresión. Al utilizar una conversión a un tipo base común (en este caso, object
), crea un escenario en el que el compilador puede determinar que la cadena también se puede convertir en objeto, por lo que el tipo de expresión se puede determinar como objeto, que también encaja con lo que su línea de código también espera como el argumento DbParameter.
Esto es lo que encontré en otro hilo y funcionó muy bien para mí:
yourVariable ?? (object)DBNull.Value
Espero que ayude.
Obtiene el error de compilación porque ambas partes de la expresión ternaria deben ser del mismo tipo. La solución más sencilla para esta situación particular es convertir ambos en un objeto:
database.AddInParameter(cmd, "@description", DbType.String,
(ilo.Description.Equals(string.Empty)) ?
(object) DBNull.Value :
(object) ilo.Description);