You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储过程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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:35:45