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

Blazor Server调用SQL存储过程取行数返回List<Object>异常

问题原因

你遇到的问题由两个核心错误导致:

  1. Dapper调用方法使用错误:QueryAsync 返回的是查询结果的行集合(类型为 IEnumerable<object>),直接对集合调用 ToString() 只会输出集合的类型名称,不会拿到你要的计数值。
  2. 变量遮蔽问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:57:03