【发布时间】:2019-11-28 11:27:00
【问题描述】:
我正在尝试使用 SQL 过程和 MVC 控制器将数据插入数据库。我有使用 HTML 表单获取的数据,然后由 Create 方法检索并添加到 SQL 过程的参数中。
public ActionResult Create([Bind(Include = "UserID,FirstName,Surname,Password,Salt,Phone_Number,Email,IsAdmin")] SaltUsersTable saltUsersTable, FormCollection fc)
{
if (ModelState.IsValid)
{
SqlConnection con = new SqlConnection(@"Connection String");
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "dbo.AddSaltedUser";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 50).Value = Request.Form["Password"];
cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar, 50).Value = Request.Form["FirstName"];
cmd.Parameters.Add("@Surname", SqlDbType.NVarChar, 50).Value = Request.Form["Surname"];
cmd.Parameters.Add("@Email", SqlDbType.NVarChar, 100).Value = Request.Form["Email"];
cmd.Parameters.Add("@PhoneNumber", SqlDbType.NVarChar, 12).Value = Request.Form["PhoneNumber"];
cmd.Parameters.Add("@response", SqlDbType.NVarChar, 250).Direction = ParameterDirection.Output;
if (Request.Form["FirstName"] == "Admin")
{
cmd.Parameters.Add("@IsAdmin", SqlDbType.Bit).Value = 1;
}
else
{
cmd.Parameters.Add("@IsAdmin", SqlDbType.Bit).Value = 0;
}
//Execute the command just established
con.Open();
Int32 rowsAffected = cmd.ExecuteNonQuery();
con.Close();
上面显示的代码是创建控制器(我已经替换为通用的连接字符串)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[AddSaltedUser]
@FirstName NVARCHAR(50),
@Surname NVARCHAR(50),
@Password NVARCHAR(50),
@PhoneNumber NVARCHAR(12),
@Email NVARCHAR(50),
@IsAdmin BIT,
@response NVARCHAR(250) OUTPUT
AS
BEGIN
SET NOCOUNT ON
DECLARE @salt UNIQUEIDENTIFIER=NEWID()
BEGIN TRY
INSERT INTO dbo.SaltUsersTable (FirstName, Surname , Password, PhoneNumber, Email, IsAdmin)
VALUES(@FirstName, @Surname, HASHBYTES('SHA_512',@Password+CAST(@salt AS NVARCHAR(36))), @PhoneNumber, @Email, @IsAdmin)
SET @response='Success'
END TRY
BEGIN CATCH
SET @response='ERROR'
END CATCH
END
这段代码是我编写的 SQL 过程,它应该插入从 MVC 控制器传递的参数,除了在过程中完成的加盐哈希。
此代码的问题在于它实际上不会向数据库中插入任何内容。当我运行代码并在 rowsAffected 有一个断点时,它显示它是 0,我不知道为什么。这段代码我哪里出错了?
但是我应该说参数确实存在,并且在控制器中正确收集了表单值,因为我已经使用调试器完成了它。
【问题讨论】:
-
@Corey SET NOCOUNT ON 不会“停止服务器计算受影响的行”,它会停止将其返回给客户端。使用 SET NOCOUNT ON 你不能得到“0行受影响”,你什么也得不到
-
在你的 catch 块中添加 throw;它会将错误抛出到您的客户端代码中
-
你是如何检查该行是否被插入的?通过查询表或仅检查您的 rowsAffected?
-
@sepupic 我查询了表的前 200 行,它为每一列返回一行 NULL。
-
这意味着不是“它实际上不会向数据库中插入任何内容”而是“它会插入空值”,您应该编辑您的问题,因为您真正的问题是“为什么我的代码插入空值”,它似乎问题不在服务器端,是你的 c# 代码传递了一些奇怪的东西
标签: c# sql-server model-view-controller ado.net