新手求助:如何在MVC中执行指定SQL查询语句
嘿,作为MVC新手,我来一步步帮你搞定这条SQL查询的执行,分几个简单的步骤来~
第一步:先验证SQL本身是否能正常运行
在动手写MVC代码之前,先确保你的SQL语句是没问题的。打开你的数据库管理工具(比如SQL Server Management Studio、DBeaver之类的),连接到目标数据库,把这段SQL直接粘进去执行:
SELECT agents.*, zone.State AS ZONE, zonedistrict.District FROM (SELECT * FROM ABC('04-01-2018' ,'04-08-2018', '%%', '%%', '', '', '', '', '')) agents INNER JOIN SW_TBL_STATE ZONE ON agents.State=ZONE.State_Id INNER JOIN SW_TBL_STATEDISTRICT zonedistrict ON agents.District=zonedistrict.District_Id;
如果能正常返回结果,说明SQL本身没问题;如果报错,先排查函数ABC是否存在、参数是否正确,或者表名/字段名有没有拼写错误。
第二步:在MVC项目里执行SQL(两种常见方式)
方式一:用ADO.NET直接执行(新手友好,快速上手)
这种方式不需要依赖ORM框架,直接操作数据库连接:
配置数据库连接字符串
- 如果是.NET Core项目,打开
appsettings.json,添加连接字符串:"ConnectionStrings": { "MyDatabase": "Server=你的服务器名称;Database=你的数据库名称;Trusted_Connection=True;" } - 如果是.NET Framework项目,打开
Web.config,添加:<connectionStrings> <add name="MyDatabase" connectionString="Server=你的服务器名称;Database=你的数据库名称;Trusted_Connection=True;" providerName="System.Data.SqlClient" /> </connectionStrings>
- 如果是.NET Core项目,打开
在Controller里写执行代码
创建一个Controller(比如AgentController),添加方法来执行SQL并返回结果:using System.Data; using System.Data.SqlClient; using Microsoft.AspNetCore.Mvc; // .NET Core 用这个 // using System.Web.Mvc; // .NET Framework 用这个 public class AgentController : Controller { public IActionResult GetAgents() { // 读取连接字符串 string connStr = Configuration.GetConnectionString("MyDatabase"); // .NET Core // string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString; // .NET Framework DataTable agentData = new DataTable(); // 用using确保连接自动释放 using (SqlConnection conn = new SqlConnection(connStr)) { string sql = @"SELECT agents.*, zone.State AS ZONE, zonedistrict.District FROM (SELECT * FROM ABC('04-01-2018' ,'04-08-2018', '%%', '%%', '', '', '', '', '')) agents INNER JOIN SW_TBL_STATE ZONE ON agents.State=ZONE.State_Id INNER JOIN SW_TBL_STATEDISTRICT zonedistrict ON agents.District=zonedistrict.District_Id;"; SqlDataAdapter adapter = new SqlDataAdapter(sql, conn); adapter.Fill(agentData); } // 把数据传给View展示 return View(agentData); } }创建View展示数据
在Views/Agent文件夹下创建GetAgents.cshtml,用循环遍历DataTable显示数据:@model System.Data.DataTable <h2>Agent List</h2> <table> <thead> <tr> @foreach (DataColumn col in Model.Columns) { <th>@col.ColumnName</th> } </tr> </thead> <tbody> @foreach (DataRow row in Model.Rows) { <tr> @foreach (var item in row.ItemArray) { <td>@item</td> } </tr> } </tbody> </table>
方式二:用Entity Framework Core(EF Core)执行原始SQL(更符合MVC的ORM风格)
如果你已经在用EF Core,可以用它来执行原始SQL,还能把结果映射到模型类:
创建ViewModel接收查询结果
根据SQL返回的字段,创建一个ViewModel类:public class AgentViewModel { // 这里对应你SQL查询返回的所有字段,比如: public int AgentId { get; set; } public string AgentName { get; set; } public string ZONE { get; set; } public string District { get; set; } // 其他字段根据你的agents表结构补充 }在Controller里用DbContext执行SQL
注入你的DbContext,然后调用FromSqlRaw执行SQL:using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; public class AgentController : Controller { private readonly YourDbContext _dbContext; // 构造函数注入DbContext public AgentController(YourDbContext dbContext) { _dbContext = dbContext; } public async Task<IActionResult> GetAgents() { string sql = @"SELECT agents.*, zone.State AS ZONE, zonedistrict.District FROM (SELECT * FROM ABC('04-01-2018' ,'04-08-2018', '%%', '%%', '', '', '', '', '')) agents INNER JOIN SW_TBL_STATE ZONE ON agents.State=ZONE.State_Id INNER JOIN SW_TBL_STATEDISTRICT zonedistrict ON agents.District=zonedistrict.District_Id;"; var agents = await _dbContext.Set<AgentViewModel>() .FromSqlRaw(sql) .ToListAsync(); return View(agents); } }创建View展示ViewModel列表
同样在Views/Agent下创建GetAgents.cshtml:@model List<YourProjectName.Models.AgentViewModel> <h2>Agent List</h2> <table> <thead> <tr> <th>Agent ID</th> <th>Agent Name</th> <th>Zone</th> <th>District</th> <!-- 其他字段对应添加 --> </tr> </thead> <tbody> @foreach (var agent in Model) { <tr> <td>@agent.AgentId</td> <td>@agent.AgentName</td> <td>@agent.ZONE</td> <td>@agent.District</td> <!-- 其他字段对应添加 --> </tr> } </tbody> </table>
几个注意点
- 记得替换连接字符串里的服务器名和数据库名,确保你的应用有访问数据库的权限
- 确认数据库里的自定义函数
ABC存在,并且参数传递正确(比如日期格式是否符合数据库要求) - 如果是.NET Framework和.NET Core的项目,代码细节会有差异,要对应调整
内容的提问来源于stack exchange,提问作者Aayush Rajopadhyaya
相关产品推荐
相关产品推荐

