Eu tenho um procedimento armazenado que possui três parâmetros e tenho tentado usar o seguinte para retornar os resultados:
context.Database.SqlQuery<myEntityType>("mySpName", param1, param2, param3);
No começo, tentei usar SqlParameter
objetos como parâmetros, mas isso não funcionou e joguei um SqlException
com a seguinte mensagem:
O procedimento ou função 'mySpName' espera o parâmetro '@ param1', que não foi fornecido.
Então, minha pergunta é como você pode usar esse método com um procedimento armazenado que espera parâmetros?
Obrigado.
c#
sql
ado.net
linq-to-entities
entity-framework-ctp5
electricsheep
fonte
fonte
Respostas:
Você deve fornecer as instâncias SqlParameter da seguinte maneira:
fonte
DbNull.Value
vez de nulos resolve o problema?Além disso, você pode usar o parâmetro "sql" como um especificador de formato:
fonte
ProcName @optionalParam1 = @opVal1, @optionalParam2 = @opVal2
Exemplo que funciona:ProcName @optionalParam1 = {0}, @optionalParam2 = {1}
Esta solução é (apenas) para o SQL Server 2005
Vocês são salvadores, mas como @Dan Mork disse, você precisa adicionar EXEC à mistura. O que estava me atrapalhando era:
:
fonte
exec
, mas posso confirmar que recebo uma exceção se a omitir.exec
palavra - chave. +1 para a remoção do @ nos parâmetros, que sempre me atrapalha.//Ou
//Ou
//Ou
fonte
A maioria das respostas é frágil porque depende da ordem dos parâmetros do SP. Melhor nomear os parâmetros do Stored Proc e atribuir valores parametrizados a eles.
Para usar parâmetros nomeados ao chamar seu SP, sem se preocupar com a ordem dos parâmetros
Usando parâmetros nomeados do SQL Server com ExecuteStoreQuery e ExecuteStoreCommand
Descreve a melhor abordagem. Melhor do que a resposta de Dan Mork aqui.
Por exemplo:
fonte
sqlParams
variável #ou
ou
ou
fonte
Eu uso este método:
Eu gosto porque simplesmente uso Guids e Datetime e o SqlQuery executa toda a formatação para mim.
fonte
A resposta de @Tom Halladay está correta com a menção de que você também deve procurar valores nulos e enviar DbNullable se os parâmetros forem nulos, pois você obteria uma exceção como
A consulta parametrizada '...' espera o parâmetro '@parameterName', que não foi fornecido.
Algo assim me ajudou
(o crédito para o método vai para https://stackoverflow.com/users/284240/tim-schmelter )
Em seguida, use-o como:
ou outra solução, mais simples, mas não genérica, seria:
fonte
Recebi a mesma mensagem de erro quando estava trabalhando com a chamada de um procedimento armazenado que usa dois parâmetros de entrada e retorna 3 valores usando a instrução SELECT e resolvi o problema como abaixo na Primeira abordagem de código EF
ATUALIZAÇÃO : Parece que com a falta da palavra-chave EXEC do SQL SERVER 2005 está criando um problema. Então, para permitir que ele funcione com todas as versões do SQL SERVER, atualizei minha resposta e adicionei EXEC na linha abaixo
fonte
Eu fiz o meu com o EF 6.x assim:
Não dobre o sqlparameter, algumas pessoas se queimam fazendo isso com suas variáveis
fonte