c# - 如何将 SQL Server 过程变量设置为从 C# ASP.NET MVC 程序输入的数据?

标签 c# sql-server asp.net-mvc stored-procedures

使用此代码时,出现错误

Procedure or function 'Registration' expects parameter '@qUsername', which was not supplied

有人可以告诉我如何解决这个问题吗?这是我的 Controller 代码和用于注册的 SQL 查询

public ActionResult Create([Bind(Include = "UserID,Username,FirstName,LastName,Email,Password,Number,IsAdmin,Salt")] UsersTable usersTable)
{
        if (ModelState.IsValid)
        {
            Int32 rowsAffected;
            SqlCommand cmd = new SqlCommand();
            SqlConnection sqlConnection1 = new SqlConnection(@"xxx");

            cmd.CommandText = "dbo.Registration";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = sqlConnection1;

            sqlConnection1.Open();

            rowsAffected = cmd.ExecuteNonQuery();

            sqlConnection1.Close();
            return RedirectToAction("Index");
        }

        return View(usersTable);
}

程序代码:

CREATE PROCEDURE dbo.Registration
    @qUsername NVARCHAR(50),
    @qPassword NVARCHAR(50),
    @qFirstName NVARCHAR(40),
    @qLastName NVARCHAR(40),
    @errorResponse NVARCHAR(250) OUTPUT
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @salt UNIQUEIDENTIFIER = NEWID()

    BEGIN TRY
        INSERT INTO dbo.UsersTable (UserID, Password, Salt, FirstName, LastName)
        VALUES (@qUsername, HASHBYTES('SHA2_512', @qPassword + CAST(@salt AS NVARCHAR(36))), @salt, @qFirstName, @qLastName)

        SET @errorResponse = 'Success'
    END TRY
    BEGIN CATCH
        SET @errorResponse = ERROR_MESSAGE()
    END CATCH
END

最佳答案

在从 C# 代码调用存储过程之前,您需要定义并设置存储过程的参数 - 如下所示:

cmd.CommandText = "dbo.Registration";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = sqlConnection1;

// define and set parameters!
cmd.Parameters.Add("@qUsername", SqlDbType.NVarChar, 50).Value = .....;
cmd.Parameters.Add("@qPassword", SqlDbType.NVarChar, 50).Value = .....;
cmd.Parameters.Add("@qFirstName", SqlDbType.NVarChar, 40).Value = .....;
cmd.Parameters.Add("@qLastName", SqlDbType.NVarChar, 40).Value = .....;

cmd.Parameters.Add("@errorResponse", SqlDbType.NVarChar, 250).Direction = ParameterDirection.Output;

sqlConnection1.Open();
rowsAffected = cmd.ExecuteNonQuery();
sqlConnection1.Close();

关于c# - 如何将 SQL Server 过程变量设置为从 C# ASP.NET MVC 程序输入的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59070499/

相关文章:

一个表中的列之间的 SQL Server 限制

asp.net-mvc - 尝试将 Azure 媒体播放器集成到 React JS 中。但 Azure 依赖的 JavaScript lib 函数未找到 "amp"

c# - 通过javascript设置iframe的用户代理

c# - 通过动态引用访问嵌套类的成员时发生 StackOverflowException

c# - 无法连接到 Android 上的 TCP 端口

c# - 我可以通过 C#/Visual Studio 中的预编译器指令检测网络连接吗?例如#if 连接到网络

c# - 我可以在 NHibernate 中使用实体代理接口(interface)的基类型安全地查询吗?

mysql - 更新表上的 370 条记录,同时为 where 语句内部连接到另一个表

python - 如何使用 Python pypyodbc 获取整个 VARCHAR(MAX) 列

c# - MVC 3 : What's the most common way of asynchronously loading form fields based on previous choices?