Blazor Server调用SQL存储过程取行数返回List<Object>异常
问题原因
你遇到的问题由两个核心错误导致:
- Dapper调用方法使用错误:
QueryAsync返回的是查询结果的行集合(类型为IEnumerable<object>),直接对集合调用ToString()只会输出集合的类型名称,不会拿到你要的计数值。 - 变量遮蔽问题:Razor 组件的
@code块中,你重新声明了一个局部变量employeeCount,覆盖了类级别的属性,导致页面绑定的属性始终没有被赋值,永远为null。
修正方案
1. 修正 LoadValue 方法
获取单个返回值应该用 Dapper 提供的 ExecuteScalarAsync 方法,直接返回查询结果第一行第一列的值:
public async Task<int> LoadValue(string storedProcedure, string connectionStringName) { string connectionString = _config.GetConnectionString(connectionStringName); using (IDbConnection connection = new SqlConnection(connectionString)) { // 改用ExecuteScalarAsync拿单个返回值,强转为int类型 var data = await connection.ExecuteScalarAsync<int>(storedProcedure, commandType: CommandType.StoredProcedure); return data; } }
2. 修正 EmployeeCount 方法
匹配返回值类型,不需要多余的 ToString() 转换:
public async Task<int> EmployeeCount() { return await _db.LoadValue("dbo.spWidget_EmployeeCount", "DefaultConnection"); }
3. 修正 Razor 组件代码
删除局部变量声明,直接给类属性赋值:
@code { private string employeeCount { get; set; } protected override async Task OnInitializedAsync() { var count = await employeeData.EmployeeCount(); // 直接给类属性赋值,不要重新声明局部变量 employeeCount = count.ToString(); Console.WriteLine(employeeCount); if (employeeCount != null) { Console.WriteLine("generic value"); } else { Console.WriteLine("no value"); } } }
验证
修改完成后运行项目,控制台会输出正确的计数49,页面也会正常展示对应数值。
内容的提问来源于stack exchange,提问作者Aakburns
相关产品推荐
相关产品推荐

