C# обновить хранимую процедуру, не внося изменений в базу данных - PullRequest
0 голосов
/ 09 января 2020

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

Моя функция, как показано ниже, имеет значения параметров 1, «Коннор Смит», 5, «Новый» соответственно

[HttpPost, ValidateAntiForgeryToken]
public ActionResult UpdateDevelopmentRequest(int changeID, string evaluator, int priority, string status)
{
        SqlCommand cmd = new SqlCommand(StoredProcedures.DevRequests.UpdateDevRequest, Conn);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@changeID", SqlDbType.Int).Value = changeID;
        cmd.Parameters.Add("@evaluator", SqlDbType.NVarChar, 30).Value = evaluator;
        cmd.Parameters.Add("@priority", SqlDbType.Int).Value = priority;
        cmd.Parameters.Add("@status", SqlDbType.NVarChar, 15).Value = status;

        //cmd.Parameters.AddWithValue("@changeID", changeID);
        //cmd.Parameters.AddWithValue("@evaluator", evaluator);
        //cmd.Parameters.AddWithValue("@priority", priority);
        //cmd.Parameters.AddWithValue("@status", status);

        Conn.Open();
        cmd.ExecuteNonQuery();
        Conn.Close();

        return RedirectToAction("DevelopmentRequests");
}

Моя хранимая процедура имеет следующий вид

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_UpdateDevRequests]
    @changeID INT,
    @evaluator NVARCHAR(30),
    @priority INT,
    @status NVARCHAR(15)
AS
    UPDATE it_ChangeRequest
    SET it_ChangeRequest.Evaluator = @evaluator, 
        it_ChangeRequest.Status = @status, 
        it_ChangeRequest.Priority = @priority
    WHERE ChangeID = @changeID

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

int result = cmd.ExecuteNonQuery();

, который возвращал 1, когда значения были правильными, и 0, когда они были неправильными (я ожидаю только 1 строку быть измененным). Я также запустил запрос отдельно, жестко запрограммировав значения, например, Declare @changeID int = 1, и запрос также работал с этим методом.

Я был озадачен этим все утро и был бы признателен за помощь

e: Я также попытался установить хранимую процедуру на priority = 2 вместо priority = @priority, чтобы убедиться, что она указана и при обновлении ожидаемой БД все работало как положено

1 Ответ

0 голосов
/ 09 января 2020

Пожалуйста, попробуйте изменить действие POST, как указано ниже, указав ParameterDirection:

[HttpPost, ValidateAntiForgeryToken]
public ActionResult UpdateDevelopmentRequest(int changeID, string evaluator, int priority, string status)
    {
        using (var conn = new SqlConnection(<your_connection_string_goes_here>))
        using (SqlCommand cmd = new SqlCommand(StoredProcedures.DevRequests.UpdateDevRequest, Conn))
        {           
             cmd.CommandType = CommandType.StoredProcedure;

             /*
             cmd.Parameters.Add("@changeID", SqlDbType.Int).Value = changeID;
             cmd.Parameters.Add("@evaluator", SqlDbType.NVarChar, 30).Value = evaluator;
             cmd.Parameters.Add("@priority", SqlDbType.Int).Value = priority;
             cmd.Parameters.Add("@status", SqlDbType.NVarChar, 15).Value = status;
             */

             var param1 = cmd.Parameters.AddWithValue("@changeID", changeID);
             cmd.Parameters["@changeID"].Direction = ParameterDirection.Input
             param1.SqlDbType = SqlDbType.Int
             var param2 = cmd.Parameters.AddWithValue("@evaluator", evaluator);
             cmd.Parameters["@evaluator"].Direction = ParameterDirection.Input
             param2.SqlDbType = SqlDbType.NVarChar
             var param3 = cmd.Parameters.AddWithValue("@priority", priority);
             cmd.Parameters["@priority"].Direction = ParameterDirection.Input
             param3.SqlDbType = SqlDbType.Int
             var param4 = cmd.Parameters.AddWithValue("@status", status);
             cmd.Parameters["@status"].Direction = ParameterDirection.Input
             param4.SqlDbType = SqlDbType.NVarChar

             Conn.Open();
             // If you want you can specify the Timeout as below
             // cmd.CommandTimeout = 300;
             cmd.ExecuteNonQuery();
             Conn.Close();
        }
        return RedirectToAction("DevelopmentRequests");
    }
...