存储过程registerStudent缺失@EmailUsername参数问题排查求助
问题排查:存储过程提示缺少@EmailUsername参数
我遇到错误提示:Procedure or function 'registerStudent' expects parameter '@EmailUsername', which was not supplied。已确认前端按要求传递了参数,API中也设置了CommandType.StoredProcedure,前端控制台能正常打印输入框内容,但API仍报错,求帮忙排查遗漏点。
JavaScript 代码
function registerStudent() { var studentID = document.getElementById('id').value; var studentEmail = document.getElementById('email').value; var studentEmailPassword = document.getElementById('password').value; var studentFirstName = document.getElementById('firstname').value; var studentLastName = document.getElementById('lastname').value; console.log(studentID + "," + studentEmail + "," + studentEmailPassword + "," + studentFirstName + "," + studentLastName); if ((studentID=='') || (studentEmail=='') || (studentEmailPassword=='') || (studentFirstName=='') || (studentLastName=='')) { alert("Please fill in all fields to register"); return false; } var postObj = { ID: studentID, EmailUsername: studentEmail, EmailPassword: studentEmailPassword, FirstName: studentFirstName, LastName: studentLastName }; var apiRequest = new XMLHttpRequest(); apiRequest.open('POST', 'https://localhost:44379/api/JSON/registerStudent', true); apiRequest.setRequestHeader('Content-Type', 'application/json'); apiRequest.onreadystatechange = function() { if (this.readyState === XMLHttpRequest.DONE && this.status === 200) { if (apiRequest.response=="-1") { alert("User already exists"); return false; } if (apiRequest.response=="1") { alert("User registered"); return false; } } } apiRequest.send(JSON.stringify(postObj)); return false; }
C# ASP.NET RESTful Web API 代码
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Net; using System.Net.Http; using System.Web; using System.IO; using System.Web.Http; using System.Web.Mvc; using System.Web.Http.Cors; namespace AiAngelsAPI.Controllers { [EnableCors(origins: "*", headers: "*", methods: "*")] public class JSONController : ApiController { /******************** * Register Student ********************/ [System.Web.Http.HttpPost] public object registerStudent(Models.RegisterStudent student) { var response = Request.CreateResponse(HttpStatusCode.OK); string sqlStoredProcedureName = "registerStudent"; var json = ExecuteRegisterStudent(sqlStoredProcedureName, student.id, student.email, student.password, student.firstname, student.lastname); response.Content = new StringContent(json); return response; } private static string ExecuteRegisterStudent(string storedProcedureNameSqlQuery, string studentID, string emailUsername, string emailPassword, string firstname, string lastname) { string json = ""; string connectionString = ConfigurationManager.AppSettings["databaseConnection"].ToString(); using (SqlConnection databaseConnection = new SqlConnection(connectionString)) { databaseConnection.Open(); // 1. create a command object identifying the stored procedure SqlCommand command = new SqlCommand(storedProcedureNameSqlQuery, databaseConnection); // 2. set the command object so it knows to execute a stored procedure command.CommandType = CommandType.StoredProcedure; // 3. add parameter to command, which will be passed to the stored procedure command.Parameters.Add(new SqlParameter("@ID", studentID)); command.Parameters.Add(new SqlParameter("@EmailUsername", emailUsername)); command.Parameters.Add(new SqlParameter("@EmailPassword", emailPassword)); command.Parameters.Add(new SqlParameter("@FirstName", firstname)); command.Parameters.Add(new SqlParameter("@Lastname", lastname)); // execute the command using (SqlDataReader returnData = command.ExecuteReader()) { // iterate through results, printing each to console while (returnData.Read()) { json = (string)returnData[0].ToString(); } } } return json; } } }
SQL 存储过程代码
ALTER PROCEDURE [dbo].[registerStudent] -- variables that will be passed into stored procedure (input) @ID varchar(16), @EmailUsername varchar(100), @EmailPassword varchar(50), @FirstName varchar(100), @LastName varchar(100) AS BEGIN -- if structure to check if student already exists/has registered if 1 = (select count(*) from [dbo].[Student] where [studentEmailUsername] = @EmailUsername) begin select -1; -- student already exists, returns -1 as indicator return; end -- inserts input into table/registers student by adding to database insert into [dbo].[Student] (studentID,studentEmailUsername,studentEmailPassword,studentFirstName,studentLastName) values (@ID,@EmailUsername,@EmailPassword,@FirstName,@LastName) select 1; -- student is added to database, returns 1 as indicator return; END
排查修复方案
1. 模型属性与前端JSON字段不匹配(核心问题)
前端传递的JSON字段是EmailUsername、FirstName、LastName(首字母大写),但API中Models.RegisterStudent类使用的是email、firstname、lastname(全小写),ASP.NET Web API默认序列化规则区分大小写,导致前端参数无法映射到模型,最终传递给存储过程的@EmailUsername为null。
解决方法二选一:
- 修改模型属性名称,与前端JSON字段完全一致:
public class RegisterStudent { public string ID { get; set; } public string EmailUsername { get; set; } public string EmailPassword { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } - 给模型属性添加
JsonProperty特性,指定映射的JSON字段名:using Newtonsoft.Json; public class RegisterStudent { [JsonProperty("ID")] public string id { get; set; } [JsonProperty("EmailUsername")] public string email { get; set; } [JsonProperty("EmailPassword")] public string password { get; set; } [JsonProperty("FirstName")] public string firstname { get; set; } [JsonProperty("LastName")] public string lastname { get; set; } }
2. 存储过程参数拼写错误
API代码中添加的参数是@Lastname(小写n),但存储过程定义的参数是@LastName(大写N),这会导致该参数无法正确传递,需修正为:
command.Parameters.Add(new SqlParameter("@LastName", lastname));
3. 调试验证参数接收情况
在API的registerStudent方法中添加调试输出,确认模型是否正确接收前端参数:
[System.Web.Http.HttpPost] public object registerStudent(Models.RegisterStudent student) { // 调试输出,查看参数是否正确接收 System.Diagnostics.Debug.WriteLine($"ID: {student.id}, Email: {student.email}, FirstName: {student.firstname}"); var response = Request.CreateResponse(HttpStatusCode.OK); string sqlStoredProcedureName = "registerStudent"; var json = ExecuteRegisterStudent(sqlStoredProcedureName, student.id, student.email, student.password, student.firstname, student.lastname); response.Content = new StringContent(json); return response; }
内容的提问来源于stack exchange,提问作者powdercakez
相关产品推荐
相关产品推荐

