如何在控制器中向PagedSearchedUserItems存储过程传参并获取返回数据
嘿,我来帮你搞定这个调用存储过程的问题!要把两个int参数传给PagedSearchedUserItems存储过程,再把返回的数据存入Items变量,咱们可以用两种最常用的.NET实现方式,下面给你详细的代码示例和说明:
方式一:使用ADO.NET(直接操作数据库连接)
这种方式适合需要更底层控制数据库操作的场景,步骤清晰且依赖少:
- 首先确保你的项目配置文件(比如
appsettings.json)里有正确的SQL Server连接字符串:
{ "ConnectionStrings": { "DefaultConnection": "Server=你的服务器名;Database=你的数据库名;Trusted_Connection=True;TrustServerCertificate=True;" } }
- 控制器代码示例:
using Microsoft.AspNetCore.Mvc; using System.Data; using System.Data.SqlClient; using System.Collections.Generic; public class UserController : Controller { private readonly IConfiguration _config; // 通过构造函数注入配置,用来获取连接字符串 public UserController(IConfiguration config) { _config = config; } public IActionResult GetUserItems(int pageNum, int pageSize) { // 初始化Items变量,用来存储返回数据 List<UserItem> Items = new List<UserItem>(); string connStr = _config.GetConnectionString("DefaultConnection"); using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand("PagedSearchedUserItems", conn)) { // 指定命令类型为存储过程 cmd.CommandType = CommandType.StoredProcedure; // 添加存储过程需要的两个int参数,参数名要和存储过程定义的完全一致! cmd.Parameters.AddWithValue("@PageNumber", pageNum); // 替换成你存储过程里的实际参数名 cmd.Parameters.AddWithValue("@PageSize", pageSize); // 替换成你存储过程里的实际参数名 conn.Open(); using (SqlDataReader reader = cmd.ExecuteReader()) { // 逐行读取数据,映射到实体类 while (reader.Read()) { Items.Add(new UserItem { // 这里根据存储过程返回的列名对应赋值,示例如下 UserId = (int)reader["UserId"], Username = reader["Username"].ToString(), Email = reader["Email"].ToString(), CreateTime = (DateTime)reader["CreateTime"] // 其他返回列依次添加对应属性 }); } } } } // 现在Items里就存储了存储过程返回的所有数据,可用于后续逻辑(比如传给视图) return View(Items); } } // 对应的实体类,属性要和存储过程返回的列一一对应 public class UserItem { public int UserId { get; set; } public string Username { get; set; } public string Email { get; set; } public DateTime CreateTime { get; set; } // 其他属性根据存储过程返回列添加 }
方式二:使用Entity Framework Core(EF Core)
如果你的项目已经在用EF Core,这种方式更简洁:
- 确保你的
DbContext里注册了UserItem实体:
public class YourDbContext : DbContext { public YourDbContext(DbContextOptions<YourDbContext> options) : base(options) { } public DbSet<UserItem> UserItems { get; set; } }
- 控制器代码示例:
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Data.SqlClient; public class UserController : Controller { private readonly YourDbContext _dbContext; // 构造函数注入DbContext public UserController(YourDbContext dbContext) { _dbContext = dbContext; } public IActionResult GetUserItems(int pageNum, int pageSize) { // 使用参数化查询调用存储过程,避免SQL注入风险 var pageNumberParam = new SqlParameter("@PageNumber", pageNum); var pageSizeParam = new SqlParameter("@PageSize", pageSize); // 执行存储过程并将结果映射到UserItem列表,存入Items变量 List<UserItem> Items = _dbContext.UserItems .FromSqlRaw("EXEC PagedSearchedUserItems @PageNumber, @PageSize", pageNumberParam, pageSizeParam) .ToList(); return View(Items); } } // 同样需要和存储过程返回列匹配的实体类 public class UserItem { public int UserId { get; set; } public string Username { get; set; } public string Email { get; set; } public DateTime CreateTime { get; set; } }
关键注意事项
- 参数名必须和存储过程定义的完全一致,否则参数无法正确传递
- 实体类的属性名称要和存储过程返回的列名匹配(SQL Server默认大小写不敏感,但名称必须一致)
- 使用ADO.NET时,
using语句会自动释放数据库连接等资源,避免内存泄漏 - 使用EF Core时,确保
UserItem实体的属性类型和存储过程返回列的类型兼容
内容的提问来源于stack exchange,提问作者Gini Gal
相关产品推荐
相关产品推荐

