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

如何在控制器中向PagedSearchedUserItems存储过程传参并获取返回数据

嘿,我来帮你搞定这个调用存储过程的问题!要把两个int参数传给PagedSearchedUserItems存储过程,再把返回的数据存入Items变量,咱们可以用两种最常用的.NET实现方式,下面给你详细的代码示例和说明:

方式一:使用ADO.NET(直接操作数据库连接)

这种方式适合需要更底层控制数据库操作的场景,步骤清晰且依赖少:

  1. 首先确保你的项目配置文件(比如appsettings.json)里有正确的SQL Server连接字符串:
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=你的服务器名;Database=你的数据库名;Trusted_Connection=True;TrustServerCertificate=True;"
  }
}
  1. 控制器代码示例:
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,这种方式更简洁:

  1. 确保你的DbContext里注册了UserItem实体:
public class YourDbContext : DbContext
{
    public YourDbContext(DbContextOptions<YourDbContext> options) : base(options) { }

    public DbSet<UserItem> UserItems { get; set; }
}
  1. 控制器代码示例:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:22:30