Как разрешить эту процедуру или функция 'SelectFollow' ожидает параметр '@userid', который не был предоставлен. '? - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь получить текущий идентификатор пользователя из параметра и проверить, существует ли он в таблице базы данных с помощью хранимой процедуры

public PartialViewResult AllStates(string state, string userid)
{

    SqlCommand cmd = new SqlCommand();
    Following following = new Following();
    cmd.Parameters.Add("@userid", SqlDbType.BigInt).Value = userid;
    List<Farmer> model = db.Farmer.Where(u => u.FarmState == state).Take(3).ToList();
    var modelfollow = db.Following.SqlQuery("[dbo].[SelectFollow]").ToList();
    ViewBag.folo = modelfollow;
    return PartialView("_UsersList", model );
}

Это моя хранимая процедура

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE SelectFollow 
    @userid INT
AS
BEGIN
DECLARE @HasFollowed BIT
    IF EXISTS(SELECT * FROM dbo.Followings Where UserId = @userid)
BEGIN
SET @HasFollowed = 1
END
ELSE
BEGIN
SET @HasFollowed = 0
END
END
GO

Есть что-то, что я делаю не так?

1 Ответ

0 голосов
/ 11 марта 2019

Проблема в этой строке, которая не включает в себя какой-либо параметр хранимой процедуры (SP), в то время как SP требует один параметр, поэтому возникло исключение, упомянутое в заголовке:

var modelfollow = db.Following.SqlQuery("[dbo].[SelectFollow]").ToList();

Также вы добавляете параметр к SqlCommand экземпляру, который содержит пустую строку запроса (и вы не выполняете его впоследствии):

SqlCommand cmd = new SqlCommand();
cmd.Parameters.Add("@userid", SqlDbType.BigInt).Value = userid;

Поскольку вы используете метод DbSet.SqlQuery(), вы можете передать параметры запроса в качестве второго параметра этого метода, объявив SqlParameter instance:

public PartialViewResult AllStates(string state, string userid)
{
    // define stored procedure parameter here
    var parameter = new SqlParameter("@userid", SqlDbType.BigInt);
    parameter.Value = userid;

    List<Farmer> model = db.Farmer.Where(u => u.FarmState == state).Take(3).ToList();

    // use stored procedure parameter declared above
    var modelfollow = db.Following.SqlQuery("[dbo].[SelectFollow] @userid", parameter).ToList();
    ViewBag.folo = modelfollow;
    return PartialView("_UsersList", model);
}
...