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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:20:41