Как я могу добавить дополнительные параметры в метод редактирования, чтобы передать их в хранимую процедуру SqlCommand?

#c# #sql-server #asp.net-mvc #stored-procedures #asp.net-core-3.1

#c# #sql-сервер #asp.net-mvc #хранимые процедуры #asp.net-core-3.1

Вопрос:

Я пытаюсь использовать хранимые процедуры с ASP.NET Методы MVC, и я хочу добавить некоторые дополнительные параметры в метод редактирования, потому что эти параметры не могут быть добавлены в модель.

Вопрос в том, как я могу извлечь эти дополнительные данные из представления и передать их контроллеру?

Мой контроллер редактирования MVC

 [HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("IdCervezas,NombreCerveza,NombreBotella,GradoAlc,CantContenidoMl,Puntuacion,Expectativas,ComentariosCerveza,EstadoCerveza")] SistemaWeb_Proyecto.Areas.Cervezas.Models.Cervezas cervezas
                                                , Int32 idDistrib, Int32 idLocal, String codPertenencia, Decimal precio)
{
    if (ModelState.IsValid)
    {
        SqlConnection connection = (SqlConnection)_context.Database.GetDbConnection();
        SqlCommand cmd = connection.CreateCommand();

        connection.Open();

        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "SP_Cervezas_InsertNewBeer";

        cmd.Parameters.Add("@nombre_Cerveza", SqlDbType.VarChar, 100).Value = cervezas.NombreCerveza;
        cmd.Parameters.Add("@nombre_Botella", SqlDbType.VarChar, 100).Value = cervezas.NombreBotella;
        cmd.Parameters.Add("@ID_TipoCerv", SqlDbType.Int).Value = null;
        cmd.Parameters.Add("@ID_Distrib", SqlDbType.Int).Value = idDistrib;
        cmd.Parameters.Add("@ID_Local", SqlDbType.Int).Value = idLocal;
        cmd.Parameters.Add("@codigo_Pertenencia", SqlDbType.VarChar, 10).Value = codPertenencia;
        cmd.Parameters.Add("@cant_Contenido_ml", SqlDbType.Int).Value = cervezas.CantContenidoMl;
        cmd.Parameters.Add("@grado_Alcohol", SqlDbType.Decimal).Value = cervezas.GradoAlc;
        cmd.Parameters.Add("@precio", SqlDbType.Decimal).Value = precio;
        cmd.Parameters.Add("@puntuacion", SqlDbType.Decimal).Value = cervezas.Puntuacion;
        cmd.Parameters.Add("@expectativas", SqlDbType.VarChar, -1).Value = cervezas.Expectativas;
        cmd.Parameters.Add("@comentariosCerveza", SqlDbType.VarChar, -1).Value = cervezas.ComentariosCerveza;

        int resultQuery = cmd.ExecuteNonQuery();

        if (resultQuery == 1)
        {
            //MessageBox.Show("Success :D");
        }
        else
        {
            //MessageBox.Show("Failed >:(");
        }

        _context.Add(cervezas);
        await _context.SaveChangesAsync();

        return RedirectToAction(nameof(Index));
    }

    return View(cervezas);
}
  

Комментарии:

1. Примечание: вы не должны использовать sp_ префикс для своих хранимых процедур. Microsoft зарезервировала этот префикс для собственного использования (см. Именование хранимых процедур ) , и вы рискуете столкнуться с конфликтом имен когда-нибудь в будущем. Это также плохо сказывается на производительности вашей хранимой процедуры . Лучше всего просто избегать sp_ и использовать что-то другое в качестве префикса — или вообще без префикса!

2. Вы пробовали создать CervezasViewModel POCO со всеми свойствами из вашей модели домена Cervezas, плюс пользовательские свойства для параметров вашей хранимой процедуры и инструктировать ваш контроллер использовать это?

3. @marc_s Спасибо 4 руководителю: D, итак … могу ли я использовать вместо sp_ префикса My_SP_ префикс? Если нет, то я попытался хотя бы изменить его, потому что в моей последней работе мы использовали имена SP с этим префиксом.

4. @AlwaysLearning ViewModel POCO? Ну, это что-то новенькое, не слышал об этом так. И я не знаю, лучший ли это путь, потому что мне пришлось бы создать специальную ViewModel для каждого SP, чтобы работать, но поправьте меня, если я ошибаюсь. Спасибо за ваш ответ

5. В MVC нередко есть модели домена, модели просмотра и модели редактирования. Код, сгенерированный ASP.NET MVC и ASP.NET Core MVC просто объединяет их в один слой по умолчанию. Однако, если у вас есть пользовательские хранимые процедуры с дополнительными параметрами для каждого объекта, возможно, вам нужно использовать другие инструменты.