Tengo el siguiente bit de código para establecer un parámetro que se utilizará en una instrucción INSERT para establecer una columna VARCHAR en una base de datos 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 algún valor leído desde XML, o si ese elemento XML está vacío, simplemente permanece como String.Empty.Configurando el parámetro a DBNull.Value usando la sintaxis ternaria da error?
De modo que cuando inserte en la base de datos, si la propiedad todavía está configurada 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);
Así que básicamente lo que digo, si es igual ilo.Description String.Empty, establezca el parámetro en DBNull.Value, de lo contrario la puso a ilo.Description.
Esto da el siguiente error en Visual Studio ...
Error 141 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 ningún error, ¡que debería ser exactamente lo mismo que usar la sintaxis condicional en línea como la de 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 Way to Bind "Null" Value to Parameter
Estoy más interesado en saber por qué, debido a que la solución obvia es usar un else if/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 parece ser BS para mí que esto no funciona; ¡Lo llamaría un error!
http://msdn.microsoft.com/en-us/library/ty67wk28.aspx
Puede obtener detalles sobre el operador ternario y este tipo de problema [en esta respuesta] (http://stackoverflow.com/questions/4290203/simple-c-why-assigning-null-in-ternary-operator-fails -no-implicit-conversion) – Steve
Gracias Steve. Su enlace era lo que estaba buscando realmente. Creo que este es un aspecto estúpido de .NET; ¿Por qué no solo evalúan si los tipos de cada resultado posible se ajustan a la afirmación? es decir, si dices Object o = (someBool)? someInt32: someString; se obtiene un error, pero ¿qué tan fácil sería evaluar que ambos resultados se pueden convertir implícitamente a un objeto, en lugar de evaluar si alguna cadena se puede convertir en algunaInt32? Me parece estúpido, pero supongo que así es. ¡Gracias! – Jim
También me gustaría comentar que estoy muy impresionado con la velocidad y la precisión de las respuestas a este hilo. ¡Esta comunidad es increíble! ¡Gracias a todos! – Jim