El siguiente código da un error: "No hay conversión implícita de DBnull a int".
SqlParameter[] parameters = new SqlParameter[1];
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex;
parameters[0] = planIndexParameter;
c#
dbnull
sqlparameter
Relatividad
fuente
fuente
==
al final de la tercera línea?)Respuestas:
El problema es que el
?:
operador no puede determinar el tipo de retorno porque está devolviendo unint
valor o un valor de tipo DBNull, que no son compatibles.Por supuesto, puede emitir la instancia de AgeIndex para que sea de tipo
object
que satisfaga el?:
requisito.Puede usar el
??
operador de fusión nula de la siguiente maneraAquí hay una cita de la documentación de MSDN para
?:
operador que explica el problemafuente
AgeItem.AgeIndex as object
??
es la misma solución que si usted fuera a utilizar el ternario regulares?:
- usted todavía necesita fundidoAgeItem.AgeIndex
a un objeto:planIndexParameter.Value = AgeItem.AgeIndex.HasValue ? (object)AgeItem.AgeIndex : DBNull.Value;
.?:
para hacer una comparación específica de tipo, entonces emitir toda la expresión no funcionará. Debe emitir el parámetro no dbnull de la siguiente manera:someID == 0 ? DBNull.Value : (object)someID
La respuesta aceptada sugiere hacer uso de un elenco. Sin embargo, la mayoría de los tipos de SQL tienen un campo nulo especial que se puede utilizar para evitar esta conversión.
Por ejemplo,
SqlInt32.Null
"Representa un DBNull que se puede asignar a esta instancia de la clase SqlInt32".fuente
exampleNoCast
se declara objeto, por lo que todavía se produce la conversión al objeto. Si, como en el código del OP, el valor se asigna directamente a SqlParameter.Value, que también es de tipo objeto, aún así obtiene el reparto.DBNull.Value
Debe pasar como un parámetro nulo dentro de SQLCommand, a menos que se especifique un valor predeterminado dentro del procedimiento almacenado (si está utilizando un procedimiento almacenado). El mejor enfoque es asignarDBNull.Value
cualquier parámetro faltante antes de la ejecución de la consulta, y seguir foreach hará el trabajo.De lo contrario, cambie esta línea:
Como sigue:
Porque no puede usar diferentes tipos de valores en la declaración condicional, ya que DBNull e int son diferentes entre sí. Espero que esto ayude.
fuente
Con una línea de código, intente esto:
fuente
Prueba esto:
fuente
Si utiliza el operador condicional (ternario), el compilador necesita una conversión implícita entre ambos tipos, de lo contrario obtendrá una excepción.
Para que pueda solucionarlo lanzando uno de los dos a
System.Object
:Pero dado que el resultado no es realmente bonito y siempre debes recordar este casting, puedes usar un método de extensión de este tipo:
Entonces puedes usar este código conciso:
fuente
En mi opinión, la mejor manera es hacer esto con la propiedad Parameters de la clase SqlCommand :
fuente
DBNull.Value
, ADO.NET podría tener un poco de dificultad para adivinar lo que podría ser SqlDbType ........ esto es conveniente - pero un poco peligroso ....Considere usar la estructura Nullable (T) disponible. Solo le permitirá establecer valores si los tiene, y sus objetos de comando SQL reconocerán el valor anulable y procesarán en consecuencia sin problemas de su parte.
fuente
fuente
Prueba esto:
En otras palabras, si el parámetro es nulo, simplemente no lo envíe a su proceso almacenado (suponiendo, por supuesto, que el proceso almacenado acepte parámetros nulos, lo cual está implícito en su pregunta).
fuente
prueba algo como esto:
fuente
Estoy resolviendo así.
fuente
fuente
Esto es lo que simplemente hago ...
fuente
fuente
Un método de extensión simple para esto sería:
fuente
Yo uso un método simple con un cheque nulo.
fuente
Mi código, trabajando en un proyecto real Mira el operador ternario antes de hacer el parámetro sql, esta es la mejor manera para mí, sin problemas:
fuente