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
相关产品推荐
相关产品推荐

