Параметризованный запрос '(@role nvarchar (5), @ count int) StudentProcedure @ role, @ count OUT' ожидает параметр '@count', который не был предоставлен - PullRequest
0 голосов
/ 14 января 2019

// Студенческий контроллер

public class Student
    {
        [Key]
        public int StudentId { get; set; }
        public string Name { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Emial { get; set; }
        public string Role { get; set; }
    }

// StudentConroller (здесь я назвал хранимую процедуру)

public class AccountController : Controller
{
    public ApplicationDbClass applicationDbClass;
    public AccountController()
    {
        applicationDbClass = new ApplicationDbClass();
    }
    public ActionResult Login()
    {
        return View();
    }
    [HttpPost]
    public ActionResult Login(Student student)
    {
            var v1 = new SqlParameter();
            v1.ParameterName = "@role";
            v1.SqlDbType = SqlDbType.NVarChar;
            v1.Value = "Admin";

            var v2 = new SqlParameter();
            v2.ParameterName = "@count";
            v2.SqlDbType = SqlDbType.Int;

            try
            {
                var result = applicationDbClass.Students.SqlQuery("StudentProcedure @role,@count OUT", v1, v2).ToArray(); 
            }
            catch(Exception e)
            {
                var m = e.Message;
            }
            return RedirectToAction("Welcome", "Student");
    }
}

// Хранимая процедура

CREATE OR ALTER PROCEDURE StudentProcedure
    @role NVARCHAR(30),
    @count INT OUTPUT
AS
BEGIN
    SELECT @count=COUNT(dbo.Students.Role) 
    FROM dbo.Students
    WHERE Role=@role;
END

// DbContext Class

public class ApplicationDbClass : DbContext
    {
        public ApplicationDbClass() : base()
        {
            Database.SetInitializer<ApplicationDbClass>(new DropCreateDatabaseIfModelChanges<ApplicationDbClass>());
        }
        public DbSet<Student> Students { get; set; }
        public DbSet<LogTable> LogTables { get; set; }
    }

// Здесь я использую первый подход к коду для работы с базой данных, используя сущностную структуру для вызова созданной пользователем хранимой процедуры. Если я внесу некоторые изменения в хранимую процедуру, она не будет указана напрямую. Пожалуйста, дайте мне любое решение, чтобы отразить изменения.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

В вашем коде есть две проблемы.

Вам следует установить значение по умолчанию для параметра output. В противном случае C# код выдаст исключение, если вы не установите значение по умолчанию для выходного параметра. Итак, ваша хранимая процедура должна выглядеть так:

ALTER PROCEDURE StudentProcedure
    @role NVARCHAR(30),
    @count INT = NULL OUTPUT
AS
BEGIN
    SELECT @count=COUNT(dbo.Students.Role) 
    FROM dbo.Students
    WHERE Role=@role;   
    SELECT @count;
END
GO

И вторая проблема - вы забыли установить Direction вашего выходного параметра:

var sqlParameter_Role = new SqlParameter("@role", "Admin");

var sqlParameter_Count = new SqlParameter();
sqlParameter_Count.ParameterName = "@count";
sqlParameter_Count.SqlDbType = SqlDbType.Int;
sqlParameter_Count.Direction = ParameterDirection.Output;

var result = db.Database
    .SqlQuery<ResultForStudentProcedure>("dbo.StudentProcedure @role" 
        , sqlParameter_Role 
        , sqlParameter_Count)
    .ToList();


public class ResultForStudentProcedure
{
    public int Count { get; set; }
}
0 голосов
/ 14 января 2019

Таким же образом можно передавать параметры

SqlConnection cnn = new SqlConnection(cnnString);
SqlCommand cmd = new SqlCommand("StudentProcedure", cnn);
cmd.Connection = cnn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@role", "Admin");
cmd.Parameters.Add("@count", SqlDbType.Int);
cmd.Parameters["@count"].Direction = ParameterDirection.Output;

string Query = cmd.ExecuteNonQuery().ToString();

Здесь моя цель - показать, как передать нормальный и выходной параметр в процедуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...