如何解决未提供存储过程参数
这是我的模型类,与数据库中的表相同:
public class AttendanceModel
{
public int UserId { get; set; }
[Display(Name = "Login As")]
public string UserRole { get; set; }
public string Password { get; set; }
public bool isActive { get; set; }
public string Email { get; set; }
public int Mobile { get; set; }
}
这是我的查看文件。如果我有任何错误,请通知我:
@model AttendanceManagement.Models.AttendanceModel
@{
ViewBag.Title = "LoginForm";
Layout = null;
}
<!DOCTYPE html>
<head>
<title>Login</title>
<!-- meta tags -->
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<meta name="keywords" content="Art Sign Up Form Responsive Widget,Audio and Video players,Login Form Web Template,Flat Pricing Tables,Flat Drop-Downs,Sign-Up Web Templates,Flat Web Templates,Login Sign-up Responsive Web Template,Smartphone Compatible Web Template,Free Web Designs for Nokia,Samsung,LG,Sony Ericsson,Motorola Web Design" />
<!-- /meta tags -->
<!-- custom style sheet -->
<link href="~/LoginStyles/css/style.css" rel="stylesheet" />
<!-- /custom style sheet -->
<!-- fontawesome css -->
<link href="~/LoginStyles/css/fontawesome-all.css" rel="stylesheet" />
<!-- /fontawesome css -->
<!-- google fonts-->
<link href="//fonts.googleapis.com/css?family=Raleway:100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i"
rel="stylesheet">
<!-- /google fonts-->
</head>
@using (Html.BeginForm())
{
<body>
<h1>Register</h1>
<div class="w3l-login-form">
<h2>Register Here</h2>
<div class="w3l-form-group">
<label>Usertype:</label>
<div class="group">
<select id="txtUser" class="form-control">
<option>Admin</option>
<option>Teacher</option>
<option>Student</option>
</select>
</div>
</div>
<div class="w3l-form-group">
<label>Email:</label>
<div class="group">
<i class="fas fa-envelope"></i>
<input type="email" class="form-control" placeholder="Email" required="required" id="txtEmail" />
</div>
</div>
<div class="w3l-form-group">
<label>Password:</label>
<div class="group">
<i class="fas fa-unlock"></i>
<input type="password" class="form-control" placeholder="Password" required="required" id="txtPassword" />
</div>
</div>
<div class="w3l-form-group">
<label>Mobile:</label>
<div class="group">
<i class="fas fa-phone"></i>
<input type="number" class="form-control" placeholder="Mobile No" required="required" id="txtMobile" />
</div>
</div>
<input type="button" id="btnRegister" value="register" onclick="Register()" />
</div>
</body>
}
@*@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}*@
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script language="javascript">
function Register() {
$("#btnRegister").val('Please wait..');
$.ajax({
url: "@Url.Content("~/Attendance/Register")",data: { Usertype: $("#txtUser").val(),Email: $("#txtEmail").val(),Password: $("#txtPassword").val(),Mobile: $("#txtMobile").val() },cache: false,type: "POST",success: function (data) {
if (data.StatusCode == 'OK') {
alert("Successfull login.");
window.location.href = '@Url.Content("~/Attendance/LoginForm")';
} else {
alert(data.Message);
}
},error: function (reponse) {
alert("error : " + reponse);
}
});
$("#btnRegister").val('register');
}
</script>
这是我的控制器存储过程方法。我已经检查了很多次,无法在存储过程中找到错误:
private AttendanceModel insertUserdetails(AttendanceModel register)
{
string constr = ConfigurationManager.ConnectionStrings["AttendanceConnect"].ToString();
DataTable dt = new DataTable();
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("attendance_insert",con))
{
using (SqlDataAdapter da = new SqlDataAdapter())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("pUserRole",SqlDbType.VarChar).Value = register.UserRole;
cmd.Parameters.AddWithValue("pEmail",SqlDbType.VarChar).Value = register.Email;
cmd.Parameters.AddWithValue("pPassword",SqlDbType.VarChar).Value = register.Password;
cmd.Parameters.AddWithValue("pMobile",SqlDbType.VarChar).Value = register.Mobile;
da.SelectCommand = cmd;
con.Open();
da.Fill(dt);
}
}
}
if (dt != null && dt.Rows != null && dt.Rows.Count > 0)
{
register = (from DataRow dr in dt.Rows
select new AttendanceModel()
{
UserId = Convert.ToInt32(dr["UserId"].ToString()),UserRole = dr["UserRole"].ToString(),Email = dr["Email"].ToString(),Password = dr["Password"].ToString(),Mobile = Convert.ToInt32(dr["Mobile"].ToString()),isActive = Convert.ToBoolean(dr["isActive"].ToString())
}).ToList().FirstOrDefault();
}
return register;
}
这是我的存储过程代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[attendance_insert]
@pUserRole varchar(10),@pEmail varchar(50),@pPassword varchar(50),@pMobile varchar(50)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO AttendanceLogin (UserRole,Email,Password,Mobile,isActive)
VALUES (@pUserRole,@pEmail,@pPassword,@pMobile,1)
END
解决方法
您犯了两个错误,这就是为什么您收到“未提供参数”的原因
第一
在此类AttendanceModel
中, UserId 未设置为主键。因此,存储过程期望它的值。
第二:
在您的控制器中,您期望这里UserId
:
UserId = Convert.ToInt32(dr["UserId"].ToString())
这显然会导致错误,因为它找不到UserId
,并且您没有在存储过程中传递它。
您可以做的是添加一个[Key]
数据批注使其成为主键。这将自动生成该字段上的主键,您将摆脱此错误:
public class AttendanceModel
{
[Key] // <-- Add this. You need to import using System.ComponentModel.DataAnnotations
public int UserId { get; set; }
[Display(Name = "Login As")]
public string UserRole { get; set; }
public string Password { get; set; }
public bool isActive { get; set; }
public string Email { get; set; }
public int Mobile { get; set; }
}
然后检查
编辑:
您在其中插入数据的代码不正确。如果您使用了存储过程,则需要传递“ @pUserRole”,而刚刚传递了pUserRole,并且所有变量都进行了类似的更改。查看以下更改:
using (SqlDataAdapter da = new SqlDataAdapter())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@pUserRole",SqlDbType.VarChar).Value = register.UserRole;
cmd.Parameters.AddWithValue("@pEmail",SqlDbType.VarChar).Value = register.Email;
cmd.Parameters.AddWithValue("@pPassword",SqlDbType.VarChar).Value = register.Password;
cmd.Parameters.AddWithValue("@pMobile",SqlDbType.VarChar).Value = register.Mobile;
da.SelectCommand = cmd;
con.Open();
da.Fill(dt);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。