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

使用System.Data.SQLite读取数据后Blazor重复显示最后一行问题

问题分析与解决:Blazor渲染SQLite数据全部显示最后一行

问题根源

你在循环外部只创建了一个ExportedFromDB对象,每次循环只是修改这个对象的属性值,然后把同一个对象引用添加到列表中。列表里的所有元素本质上都是指向同一个内存地址的对象,最终所有条目都会显示最后一次修改的属性值。

修复代码

把ExportedFromDB的实例化移到while (reader.Read())循环内部,每次循环创建新的对象:

public List<ExportedFromDB> TalkToDBAndGetTheExportMetadata(string jobID)
{
    var list = new List<ExportedFromDB>();
    var dbPath = @"c:\ProgramData\StorageQuest\Rook Archive\Jobs\" + jobID + ".sqlite";
    // 使用using自动管理连接释放,无需手动Close
    using (var conn = new SQLiteConnection($"Data Source={dbPath};Version=3;"))
    {
        conn.Open();
        using (var command = new SQLiteCommand("SELECT * FROM Exported", conn))
        {
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    // 每次循环创建新的对象实例
                    ExportedFromDB exportedFromDB = new ExportedFromDB();
                    exportedFromDB.Id = reader["Id"].ToString();
                    exportedFromDB.ExportType = reader["ExportType"].ToString();
                    exportedFromDB.Path = reader["Path"].ToString();
                    exportedFromDB.Size = (long)reader["Size"];                            
                    list.Add(exportedFromDB);
                }
            }
        }
    }
    return list;
}

额外优化建议

  • 字段转属性:把ExportedFromDB的字段改为自动属性,符合C#编码规范,Blazor绑定也更友好:
public class ExportedFromDB
{
    public string Id { get; set; }
    public string ExportType { get; set; }
    public string Path { get; set; }
    public long Size { get; set; }        
}
  • 路径处理优化:用Path.Combine拼接路径,避免转义符和格式错误:
var dbPath = Path.Combine(@"c:\ProgramData\StorageQuest\Rook Archive\Jobs", $"{jobID}.sqlite");
  • 移除冗余代码:原代码中嵌套的第一个SQLiteCommand完全未使用,直接删除即可。
  • 避免重复查库:Blazor每次渲染都会执行数据库查询,建议在组件初始化时加载数据缓存:
@code {
    private List<ExportedFromDB> _exportedData;

    protected override void OnInitialized()
    {
        _exportedData = rookDashboardExtras.TalkToDBAndGetTheExportMetadata(job.ObjectId);
    }
}

<div class="RookJobBlockRight">
    @foreach (var exported in _exportedData)
    {
        <p>exprt: @exported.Path</p>
    }
</div>

内容的提问来源于stack exchange,提问作者RichardCooke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:05:26