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

C#调用多表行数统计存储过程报错,单变量调用正常求助

问题分析与解决方案

问题根源

你的存储过程当前返回的是9行1列的结果集,列名统一为第一个查询的BurnOut,每行对应一个表的计数。但你的DTO模型类是包含9个属性(如BurnOut、CIP等)的单对象,ORM无法将多行结果映射到单个DTO实例,因此调用报错;而仅传递单个变量时,存储过程返回单行单列,能匹配单个属性,所以可以正常运行。

修正后的存储过程(匹配DTO结构)

将所有表的计数作为单行多列返回,这样就能和DTO的属性一一对应:

ALTER PROCEDURE [dbo].[GetTotalNumberOfFormsSubmitted]
AS
BEGIN
    SELECT 
        (SELECT COUNT(*) FROM Client_BurnOuts) AS BurnOut,
        (SELECT COUNT(*) FROM Client_CIPEnergyCrisises) AS CIP,
        (SELECT COUNT(*) FROM Client_HomeRepairs) AS HomeRepair,
        (SELECT COUNT(*) FROM Client_MedicalTravelAssistances) AS MadicalTravelAssistan,
        (SELECT COUNT(*) FROM Client_EmergencyAssistances) AS EmergencyAssistance,
        (SELECT COUNT(*) FROM Client_Heatings) AS Heating,
        (SELECT COUNT(*) FROM Client_DukeEnergyFoundations) AS DuckFoundation,
        (SELECT COUNT(*) FROM Client_EmergencyFoodPantries) AS FoodPantry,
        (SELECT COUNT(*) FROM Client_MedicalEquipments) AS MedicalEquipment
END

扩展:直接返回百分比(适配图表需求)

如果需要直接获取百分比用于图表展示,可以先计算总计数,再生成各表的计数和百分比(处理总计数为0的情况避免除零错误):

ALTER PROCEDURE [dbo].[GetTotalNumberOfFormsSubmittedWithPercentage]
AS
BEGIN
    -- 计算所有表的总行数
    DECLARE @Total INT = (
        SELECT COUNT(*) FROM Client_BurnOuts
        + COUNT(*) FROM Client_CIPEnergyCrisises
        + COUNT(*) FROM Client_HomeRepairs
        + COUNT(*) FROM Client_MedicalTravelAssistances
        + COUNT(*) FROM Client_EmergencyAssistances
        + COUNT(*) FROM Client_Heatings
        + COUNT(*) FROM Client_DukeEnergyFoundations
        + COUNT(*) FROM Client_EmergencyFoodPantries
        + COUNT(*) FROM Client_MedicalEquipments
    )

    SELECT 
        BurnOutCount = (SELECT COUNT(*) FROM Client_BurnOuts),
        BurnOutPercentage = CASE WHEN @Total = 0 THEN 0 ELSE (SELECT COUNT(*) FROM Client_BurnOuts) * 100.0 / @Total END,
        CIPCount = (SELECT COUNT(*) FROM Client_CIPEnergyCrisises),
        CIPPercentage = CASE WHEN @Total = 0 THEN 0 ELSE (SELECT COUNT(*) FROM Client_CIPEnergyCrisises) * 100.0 / @Total END,
        HomeRepairCount = (SELECT COUNT(*) FROM Client_HomeRepairs),
        HomeRepairPercentage = CASE WHEN @Total = 0 THEN 0 ELSE (SELECT COUNT(*) FROM Client_HomeRepairs) * 100.0 / @Total END,
        MadicalTravelAssistanCount = (SELECT COUNT(*) FROM Client_MedicalTravelAssistances),
        MadicalTravelAssistanPercentage = CASE WHEN @Total = 0 THEN 0 ELSE (SELECT COUNT(*) FROM Client_MedicalTravelAssistances) * 100.0 / @Total END,
        EmergencyAssistanceCount = (SELECT COUNT(*) FROM Client_EmergencyAssistances),
        EmergencyAssistancePercentage = CASE WHEN @Total = 0 THEN 0 ELSE (SELECT COUNT(*) FROM Client_EmergencyAssistances) * 100.0 / @Total END,
        HeatingCount = (SELECT COUNT(*) FROM Client_Heatings),
        HeatingPercentage = CASE WHEN @Total = 0 THEN 0 ELSE (SELECT COUNT(*) FROM Client_Heatings) * 100.0 / @Total END,
        DuckFoundationCount = (SELECT COUNT(*) FROM Client_DukeEnergyFoundations),
        DuckFoundationPercentage = CASE WHEN @Total = 0 THEN 0 ELSE (SELECT COUNT(*) FROM Client_DukeEnergyFoundations) * 100.0 / @Total END,
        FoodPantryCount = (SELECT COUNT(*) FROM Client_EmergencyFoodPantries),
        FoodPantryPercentage = CASE WHEN @Total = 0 THEN 0 ELSE (SELECT COUNT(*) FROM Client_EmergencyFoodPantries) * 100.0 / @Total END,
        MedicalEquipmentCount = (SELECT COUNT(*) FROM Client_MedicalEquipments),
        MedicalEquipmentPercentage = CASE WHEN @Total = 0 THEN 0 ELSE (SELECT COUNT(*) FROM Client_MedicalEquipments) * 100.0 / @Total END
END

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:10:58