O código a seguir fornece um erro - "Nenhuma conversão implícita de DBnull para 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
Relatividade
fonte
fonte
==
o final da 3ª linha?) #Respostas:
O problema é que o
?:
operador não pode determinar o tipo de retorno porque você está retornando umint
valor ou um valor do tipo DBNull, que não é compatível.Obviamente, é possível converter a instância do AgeIndex para um tipo
object
que atenda ao?:
requisito.Você pode usar o
??
operador coalescente nulo da seguinte maneiraAqui está uma citação da documentação do MSDN para o
?:
operador que explica o problemafonte
AgeItem.AgeIndex as object
??
é a mesma solução como se você fosse usar o ternário regulares?:
- você ainda precisa de elencoAgeItem.AgeIndex
para um objeto:planIndexParameter.Value = AgeItem.AgeIndex.HasValue ? (object)AgeItem.AgeIndex : DBNull.Value;
.?:
para fazer uma comparação específica de tipo, a conversão da expressão inteira não funcionará. Você deve converter o parâmetro non-dbnull da seguinte forma:someID == 0 ? DBNull.Value : (object)someID
A resposta aceita sugere fazer uso de um elenco. No entanto, a maioria dos tipos SQL possui um campo Nulo especial que pode ser usado para evitar essa conversão.
Por exemplo,
SqlInt32.Null
"Representa um DBNull que pode ser atribuído a esta instância da classe SqlInt32."fonte
exampleNoCast
é declarado objeto, portanto, a conversão para objeto ainda ocorre. Se, como no código do OP, o valor for atribuído diretamente a SqlParameter.Value, que também é do tipo objeto, você ainda obtém a conversão.Você precisa passar
DBNull.Value
como um parâmetro nulo no SQLCommand, a menos que um valor padrão seja especificado no procedimento armazenado (se você estiver usando o procedimento armazenado). A melhor abordagem é atribuirDBNull.Value
qualquer parâmetro ausente antes da execução da consulta, e seguir a seguir fará o trabalho.Caso contrário, altere esta linha:
Do seguinte modo:
Como você não pode usar tipos diferentes de valores na instrução condicional, como DBNull e int são diferentes um do outro. Espero que isso ajude.
fonte
Com uma linha de código, tente o seguinte:
fonte
Tente o seguinte:
fonte
Se você usar o operador condicional (ternário), o compilador precisará de uma conversão implícita entre os dois tipos, caso contrário, você receberá uma exceção.
Assim, você pode corrigi-lo lançando um dos dois para
System.Object
:Mas como o resultado não é muito bonito e você sempre deve se lembrar dessa transmissão, você pode usar esse método de extensão:
Então você pode usar este código conciso:
fonte
Na minha opinião, a melhor maneira é fazer isso com a propriedade Parameters da classe SqlCommand :
fonte
DBNull.Value
, ADO.NET pode ter um pouco de um momento difícil adivinhar o que SqlDbType que poderia ser ........ este é conveniente - mas um pouco perigoso ....Considere usar a estrutura Nullable (T) disponível. Isso permitirá que você defina valores apenas se os tiver, e seus objetos de Comando SQL reconhecerão o valor anulável e serão processados de acordo com isso sem problemas.
fonte
fonte
Tente o seguinte:
Em outras palavras, se o parâmetro for nulo, simplesmente não o envie ao seu processo armazenado (supondo, é claro, que o processo armazenado aceite parâmetros nulos, o que está implícito na sua pergunta).
fonte
tente algo como isto:
fonte
Estou resolvendo assim.
fonte
fonte
Isto é o que eu simplesmente faço ...
fonte
fonte
Um método de extensão simples para isso seria:
fonte
Eu uso um método simples com uma verificação nula.
fonte
Meu código, trabalhando em projeto real Olhe o operador ternário antes de fazer o parâmetro sql, este é o melhor caminho para mim, sem problemas:
fonte