使用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
相关产品推荐
相关产品推荐

