Problema
Eu estava usando a estrutura de entidade para chamar um procedimento armazenado do código.
SqlParameter param1 = new SqlParameter("@onlinestatus", true);
SqlParameter param2 = new SqlParameter("@userid", 21425);
SqlParameter param3 = new SqlParameter("@onlineid", 0);
db.Database.SqlQuery<online_stats>("online_stats @onlinestatus, @userid, @onlineid", param1, param2, param3);
Mas continuava recebendo o erro abaixo:
An exception of type 'System.Data.SqlClient.SqlException' occurred in EntityFramework.SqlServer.dll but was not handled in user code
Additional information: The parameterized query '(@onlinestatus bit,@userid int,@onlineid int)online_stats @onlin' expects the parameter '@onlineid', which was not supplied.
Razão?????????
SqlParameter tem cerca de 7 construtores.
Dois dos quais estavam criando problemas para mim.
1. SqlParameter(string parametername, Object value)
2. SqlParameter(string parametername, SqlDbType dbtype)
Embora eu pretendesse usar o primeiro construtor especificando o nome e o valor do meu parâmetro, o valor ‘0’ do parâmetro estava sendo tratado como valor de SqlDbType (pois é um enum) . & continuei recebendo o erro acima.
Não tive problemas com os dois primeiros parâmetros, pois eles têm os seguintes valores
@onlinestatus = true & @userid = 21425(which is biig number.)
Eu teria o mesmo problema com @userid, se o valor fosse menor que 25.
Solução:
O próprio erro acima é um pouco confuso. De qualquer forma, a solução para isso era usar um construtor diferente ou especificar o valor para o parâmetro separadamente.
param3.Value = 0;