Visual Studio中C# REST API向SQL Server提交数据及序列更新咨询
实现方案:在C# REST API中处理SQL Server数据插入需求
Absolutely! You can submit data to SQL Server using SQL queries in your Visual Studio-built C# REST API, and since your POST endpoint only accepts JSON, we’ll handle all database logic on the backend (no need to pass raw SQL through requests). Let’s walk through how to implement your two requirements step by step:
1. 先对齐模型与数据库结构
首先,更新你的AddNewRequest模型,补充日期字段和与数据库序列绑定的字段(假设你的AddNewRequest表已包含这些字段):
public partial class AddNewRequest { public int RequestId { get; set; } // 由数据库序列填充的字段 public int UserId { get; set; } public string UserName { get; set; } public string Category { get; set; } public string SubCategory { get; set; } // 修正了原拼写"SubCateory",保证前后一致性 public DateTime RequestDate { get; set; } // 需要填充的日期字段 }
2. POST接口的核心实现逻辑
我会介绍两种常用方案——Entity Framework Core(推荐,ORM简化开发)和ADO.NET(直接控制SQL语句):
方案一:使用Entity Framework Core
可选方式A:手动获取序列值
在API控制器的POST方法中,接收JSON payload后,填充日期字段、获取序列下一个值,再保存数据:
[HttpPost] public async Task<IActionResult> PostAddNewRequest(AddNewRequest request) { if (!ModelState.IsValid) { return BadRequest(ModelState); } // 需求一:填充日期字段(推荐用UTC时间避免时区问题) request.RequestDate = DateTime.UtcNow; // 需求二:获取数据库序列的下一个值 var nextSequenceValue = await _context.Database.ExecuteScalarAsync<int>( "SELECT NEXT VALUE FOR dbo.RequestSequence"); request.RequestId = nextSequenceValue; // 插入数据库 _context.AddNewRequests.Add(request); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(GetAddNewRequest), new { id = request.RequestId }, request); }
可选方式B:通过EF配置自动生成序列值
如果你的序列与RequestId主键绑定,可以配置EF Core自动使用序列的下一个值,无需手动查询:
// 在DbContext的OnModelCreating方法中配置 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<AddNewRequest>() .Property(r => r.RequestId) .HasDefaultValueSql("NEXT VALUE FOR dbo.RequestSequence"); }
此时POST方法只需填充日期字段即可:
[HttpPost] public async Task<IActionResult> PostAddNewRequest(AddNewRequest request) { if (!ModelState.IsValid) { return BadRequest(ModelState); } request.RequestDate = DateTime.UtcNow; _context.AddNewRequests.Add(request); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(GetAddNewRequest), new { id = request.RequestId }, request); }
方案二:使用ADO.NET(直接执行SQL)
如果你更倾向于直接操作SQL语句,可以用SqlConnection执行参数化插入查询(一定要用参数化查询避免SQL注入!):
[HttpPost] public async Task<IActionResult> PostAddNewRequest(AddNewRequest request) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var connectionString = _configuration.GetConnectionString("ICTConnection"); // 从appsettings.json获取连接字符串 using (var conn = new SqlConnection(connectionString)) { await conn.OpenAsync(); // 需求一:使用UTC日期保证一致性 var requestDate = DateTime.UtcNow; // 需求二:插入数据时使用序列的下一个值 var insertSql = @" INSERT INTO AddNewRequest (RequestId, UserId, UserName, Category, SubCategory, RequestDate) VALUES (NEXT VALUE FOR dbo.RequestSequence, @UserId, @UserName, @Category, @SubCategory, @RequestDate) SELECT SCOPE_IDENTITY();"; // 返回刚创建的RequestId var parameters = new SqlParameter[] { new SqlParameter("@UserId", request.UserId), new SqlParameter("@UserName", request.UserName), new SqlParameter("@Category", request.Category), new SqlParameter("@SubCategory", request.SubCateory), // 匹配你当前模型的拼写(建议修正为SubCategory) new SqlParameter("@RequestDate", requestDate) }; var newRequestId = await conn.ExecuteScalarAsync<int>(insertSql, parameters); request.RequestId = newRequestId; request.RequestDate = requestDate; } return CreatedAtAction(nameof(GetAddNewRequest), new { id = request.RequestId }, request); }
3. 关键注意事项
- 时区最佳实践:使用
DateTime.UtcNow而非DateTime.Now,避免API服务器与数据库的时区差异问题,前端展示时再转换为用户本地时区。 - 数据库序列创建:确保你已在SQL Server中创建对应的序列:
CREATE SEQUENCE dbo.RequestSequence START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999 -- 如果需要序列达到最大值后重置,可添加CYCLE关键字 - 拼写修正:建议把模型中的
SubCateory改为SubCategory,符合命名规范并避免数据库映射错误。 - SQL注入防护:始终使用参数化查询(上述两种方案均已实现),防止恶意SQL注入攻击。
内容的提问来源于stack exchange,提问作者Kriti Rana
相关产品推荐
相关产品推荐

