ASP.NET Core 对接 SQL Server:数据库表数据无法在Web应用显示
验证数据是否读取到集合及排查方案
一、验证list集合是否有数据的方法
1. 控制台打印输出
在OnGet方法读取完数据后,添加代码打印集合的记录数和具体内容:
// 在try块的末尾添加 Console.WriteLine($"读取到{listTransactions.Count}条交易记录"); foreach(var trans in listTransactions) { Console.WriteLine($"日期:{trans.CurrentDate},金额:{trans.Amount},分类:{trans.Category}"); }
注意:ASP.NET Core的控制台输出会显示在Visual Studio的「输出」面板(不是命令行窗口),运行程序后切换到该面板查看。
2. 页面临时显示记录数
在HTML页面的表格上方添加一行代码,直接显示集合的元素数量:
<p>总记录数:@Model.listTransactions.Count</p>
如果显示为0,说明集合确实没有数据;大于0则是页面渲染的问题(你的循环逻辑看起来无异常)。
3. 调试断点查看
在OnGet方法的末尾(try块结束前)设置断点,启动调试模式。当程序命中断点时,在「局部变量」窗口查看listTransactions的内容,确认是否有元素。
二、排查数据读取失败的可能原因
1. 数据库连接与表的匹配问题
- 你的连接字符串指向
master系统数据库,确认January表是否真的在master库中?通常业务表不会放在系统库,建议检查Initial Catalog是否为你的业务数据库名称。 - 验证表名、列名是否完全正确(SQL Server默认不区分大小写,但如果数据库设置了区分大小写则需要严格匹配)。
2. 数据类型匹配问题
如果数据库中字段类型与代码读取方式不兼容,可能会导致隐式错误(甚至不抛出异常但读取失败):
- 如果
CurrentDate是DateTime类型,直接用reader.GetString(0)会报错,建议修改为:transactionsinfo.CurrentDate = reader.IsDBNull(0) ? null : reader.GetDateTime(0).ToString("yyyy-MM-dd"); - 如果
Amount是decimal类型(SQL Server推荐用decimal存储金额),用reader.GetFloat(1)可能导致精度丢失或读取失败,修改为:transactionsinfo.Amount = reader.IsDBNull(1) ? 0 : Convert.ToSingle(reader.GetDecimal(1)); - 添加
IsDBNull判断,避免字段为NULL时抛出异常。
3. 异常信息可视化
当前的异常捕获仅打印到控制台,可能看不到错误。建议将异常信息存入ViewData,在页面显示:
catch (Exception ex) { ViewData["ErrorMessage"] = "数据读取失败:" + ex.ToString(); Console.WriteLine("Exception: " + ex.ToString()); }
然后在页面中添加错误提示:
@if(ViewData["ErrorMessage"] != null) { <div class="alert alert-danger">@ViewData["ErrorMessage"]</div> }
修改后的完整C#代码示例
using Microsoft.AspNetCore.Mvc.RazorPages; using System.Data.SqlClient; namespace Budget_Tracker_App.Pages.transactions { public class IndexModel : PageModel { public List<Transactions> listTransactions = new List<Transactions>(); public void OnGet() { try { // 替换为你的业务数据库名称 String connectionString = "Data Source=DAKI;Initial Catalog=YourBudgetDB;Integrated Security=True"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); String sql = "SELECT CurrentDate, Amount, Category FROM January"; using (SqlCommand command = new SqlCommand(sql, connection)) { using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Transactions transactionsinfo = new Transactions(); // 处理日期字段,兼容NULL和DateTime类型 transactionsinfo.CurrentDate = reader.IsDBNull(0) ? null : reader.GetDateTime(0).ToString("yyyy-MM-dd"); // 处理金额字段,兼容NULL和decimal类型 transactionsinfo.Amount = reader.IsDBNull(1) ? 0 : Convert.ToSingle(reader.GetDecimal(1)); transactionsinfo.Category = reader.IsDBNull(2) ? null : reader.GetString(2); listTransactions.Add(transactionsinfo); } } } } // 打印数据到控制台验证 Console.WriteLine($"读取到{listTransactions.Count}条交易记录"); foreach(var trans in listTransactions) { Console.WriteLine($"日期:{trans.CurrentDate},金额:{trans.Amount},分类:{trans.Category}"); } } catch (Exception ex) { ViewData["ErrorMessage"] = "数据读取失败:" + ex.ToString(); Console.WriteLine("Exception: " + ex.ToString()); } } } public class Transactions { public string? CurrentDate; public float Amount; public string? Category; } }
修改后的HTML页面示例
@page @model Budget_Tracker_App.Pages.transactions.IndexModel @{} <br> <h2>Previous Transactions</h2> <!-- 显示错误信息 --> @if(ViewData["ErrorMessage"] != null) { <div class="alert alert-danger">@ViewData["ErrorMessage"]</div> } <!-- 显示总记录数 --> <p>总记录数:@Model.listTransactions.Count</p> <a class='btn btn-primary btn-sm' href='/January/Create'>New Transactions</a> <table class="table"> <thead> <tr> <th>Current Date</th> <th>Amount</th> <th>Category</th> <th>Action</th> </tr> </thead> <tbody> @foreach(var item in Model.listTransactions) { <tr> <td>@item.CurrentDate</td> <td>@item.Amount</td> <td>@item.Category</td> <td> <a class="btn btn-primary btn-sm" href="/January/Edit?id=">Edit</a> <a class="btn btn-danger btn-sm" href="/January/Delete?id=">Delete</a> </td> </tr> } </tbody> </table>
内容的提问来源于stack exchange,提问作者hcram_yaj
相关产品推荐
相关产品推荐

