c# - 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
确保它被指向并更新预期的数据库,并且在这样做时一切都按预期工作
解决方案
请尝试通过指定 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");
}
推荐阅读
- ruby-on-rails - 使用 Lockbox 和 CarrierWave 为 Ruby on Rails 加密和解密文件上传
- c# - 如何使精灵在精灵上方移动时变慢?
- rebol - 如何增量读取二进制文件
- java - 不同的嵌套列表,按值属性比较列表项,Java8 Lambda
- docker - Docker Kubernetes 服务(DKS)的特点
- arrays - 减去 2 个字符串数组时的奇怪行为
- google-bigquery - 如何计算 BigQuery 中分区的平均事件频率
- mysql - 通过 Mysql 反应原生 json 解析
- c# - 如何再次单击将返回游戏的退出键?
- python - 使用 Jyupter Notebook 导入 GDAL 和 ogr 时遇到问题