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

ASP.NET Web API项目更新已插入员工记录时重复新增问题求助

问题排查&修复方案

你的代码总共存在4个核心问题,按优先级修复即可:

问题1:前端提交时未传递隐藏域存储的员工ID

你插入成功后已经把ID写入了.HiddenID隐藏域,但组装提交数据时没有读取该字段,导致后端收到的员工ID永远为空。

修复:在前端Ajax的data组装逻辑开头新增一行

var data = new Object();
// 新增下面这行,读取隐藏域的ID,没有的话就是空(代表新插入)
data.EmpID = $('.HiddenID').val() ? parseInt($('.HiddenID').val()) : null;
data.UserName = $('#username').val();
// 剩余字段赋值保持不变

问题2:后端未将员工ID传递给存储过程

你的Emp_OfficialDetails方法没有给存储过程的@EmpID参数赋值,就算前端传了ID也不会给到数据库。

修复:在后端参数赋值逻辑开头新增一行

#region Employee Official Details Insert Code block
// 新增下面这行,处理空值避免数据库报错
com.Parameters.AddWithValue("@EmpID", emp.EmpID ?? (object)DBNull.Value);
com.Parameters.AddWithValue("@UserName", emp.UserName);
// 剩余参数赋值保持不变

问题3:存储过程更新判断逻辑完全错误

你当前的判断条件是「所有字段完全一致的记录存在才更新」,这个逻辑完全不符合需求:只要你修改了任意一个字段,判断就会不通过,直接走插入逻辑。同时还存在笔误,HiredbyReferenceName = HiredbyReferenceName漏了@,这个条件永远为真。

修复:替换存储过程的判断逻辑

ALTER PROCEDURE [dbo].[InsEmpOfficialDetails] 
    (@EmpID int = NULL,
     @UserName varchar(500) = NULL,
     @pass varchar(500) = NULL,
     @OfficialEmailAddress varchar(500) = NULL,
     @Department varchar(500) = NULL,
     @RoleID int = NULL,
     @Role varchar(500) = NULL,
     @IsAdmin bit = NULL,
     @Designation varchar(500) = NULL,
     @ReportToID int = NULL,
     @ReportTo varchar(500) = NULL,
     @JoiningDate datetime = NULL,
     @IsPermanent bit = NULL,
     @DateofPermanancy datetime = NULL,
     @IsActive bit = NULL,
     @HiredbyReference bit = NULL,
     @HiredbyReferenceName varchar(500) = NULL,
     @BasicSalary int = NULL,
     @CurrentPicURL nvarchar(max) = NULL
    )
AS
BEGIN
    -- 改为判断EmpID非空且对应记录存在,就走更新
    IF @EmpID IS NOT NULL AND EXISTS (SELECT 1 FROM Employee WHERE EmpID = @EmpID)
    BEGIN
        UPDATE Employee
        SET UserName = @UserName,
            pass = @pass,
            OfficialEmailAddress = @OfficialEmailAddress,
            Department = @Department,
            RoleID = @RoleID,
            Role = @Role,
            IsAdmin = @IsAdmin,
            Designation = @Designation,
            ReportToID = @ReportToID,
            ReportTo = @ReportTo,
            JoiningDate = @JoiningDate,
            IsPermanent = @IsPermanent,
            DateofPermanancy = @DateofPermanancy,
            IsActive = @IsActive,
            HiredbyReference = @HiredbyReference,
            -- 这里原来漏了@,必须补上
            HiredbyReferenceName = @HiredbyReferenceName,
            BasicSalary = @BasicSalary,
            CurrentPicURL = @CurrentPicURL
        WHERE EmpID = @EmpID
        -- 更新完成返回当前ID,保持前端逻辑兼容
        SELECT @EmpID
    END
    ELSE
    BEGIN
        SET NOCOUNT ON;
        INSERT INTO Employee(UserName, pass,
OfficialEmailAddress,Department,
RoleID, Role, IsAdmin, Designation,
ReportToID, ReportTo, JoiningDate,
IsPermanent, DateofPermanancy, IsActive,
HiredbyReference, HiredbyReferenceName,
BasicSalary, CurrentPicURL)
        VALUES (@UserName, @pass, @OfficialEmailAddress, @Department,
                @RoleID, @Role, @IsAdmin, @Designation,
                @ReportToID, @ReportTo, @JoiningDate,
                @IsPermanent, @DateofPermanancy, @IsActive,
                @HiredbyReference, @HiredbyReferenceName,
                @BasicSalary, @CurrentPicURL)
        SELECT SCOPE_IDENTITY();
    END
END

问题4:存储过程更新后没有返回值

原来的逻辑只有插入后返回了自增ID,更新后没有返回值,会导致前端成功回调里的ID解析异常,上面的修复代码已经补充了更新后的ID返回逻辑,无需额外修改。

修复完成后,首次提交会走插入逻辑,返回ID写入隐藏域,之后的提交都会带上ID走更新逻辑,不会再重复插入数据。


内容的提问来源于stack exchange,提问作者Syed Muhammad Aousaja Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:24:03