首页 > 解决方案 > C#更新存储过程不更改数据库

问题描述

我看过类似的主题,但没有运气,它看起来(对我来说)就像我做的事情正确,但数据库只是没有更新。

我的函数,如下所示,参数值分别为 1、“Connor Smith”、5、“New”

[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 行)。我还单独运行了查询,对 eg 中的值进行了硬编码,Declare @changeID int = 1并且查询也可以使用这种方法正常工作。

我整个早上都被这件事难住了,希望能得到一些帮助

e:我还尝试将存储过程设置为只是priority = 2而不是priority = @priority确保它被指向并更新预期的数据库,并且在这样做时一切都按预期工作

标签: c#.netsql-serverstored-procedures

解决方案


请尝试通过指定 ParameterDirection 来更改您的 POST 操作:

[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");
    }

推荐阅读