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

从T-SQL存储过程取数据至C# DataTable结果异常求助

问题:C# DataTable与T-SQL存储过程执行结果不一致

从T-SQL存储过程中检索数据并导入到C# DataTable时,DataTable显示的结果与直接执行存储过程得到的结果不一致,具体表现为DataTable存在行缺失或数据值不符的情况。

C# 代码

public DataTable  GetData()
{
    string nameOfSp = "sp_SIA_Get_Ratio_Demand_Receipt";

    DataAccess dataAccess = new DataAccess();

    DataTable dt = new DataTable();

    dataAccess.OpenDatabase(DataAccess.ConnectionTo.SQL);

    SqlConnection sqlCon = dataAccess.GetSqlConnection();

    try
    {
        SqlCommand cmd = new SqlCommand(nameOfSp, sqlCon);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandTimeout = 1000;

        cmd.Parameters.Add("@COMPANY", SqlDbType.VarChar).Value = filter.CompanyNo;
        cmd.Parameters.Add("@YEARWEEK_FROM", SqlDbType.VarChar).Value = filter.YearWeekFrom;
        cmd.Parameters.Add("@YEARWEEK_TO", SqlDbType.VarChar).Value = filter.YearWeekTo;
        cmd.Parameters.Add("@USERNAME", SqlDbType.VarChar).Value = filter.UserName;

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Could not retrieve data from stored procedure " + ex.Message);
    }

    dataAccess.CloseDatabase();

    return dt;
}

T-SQL 存储过程代码

ALTER PROCEDURE [dbo].[sp_SIA_Get_Ratio_Demand_Receipt]
    @COMPANY as varchar(4),
    @USERNAME as varchar(50),
    @YEARWEEK_FROM as varchar(6),
    @YEARWEEK_TO as varchar(6)
AS
BEGIN
    SET NOCOUNT ON;

    WITH #MATERIAL (COMPANY_NO, MATERIAL_NO, STORAGE_LOCATION, INVENTORY_QTY, INVENTORY_VAL) AS 
    (
        SELECT 
            p.COMPANY_NO, p.ITEM_NO, p.STORAGE_LOCATION, 
            SUM(STOCK_QUANTITY), SUM(STOCK_VALUE)
        FROM  
            tbl_SIA_Sel_PartNos p 
        INNER JOIN 
            [FUM_DWH].[dbo].[View_SCM_FACT_610_WAREHOUSE_STOCK] s ON p.ITEM_NO = s.ITEM_NO
                                                                  AND p.COMPANY_NO = s.COMPANY_NO
                                                                  AND p.STORAGE_LOCATION = s.STORAGE_LOCATION
        WHERE 
            p.USERNAME = @USERNAME
            AND s.YEARWEEK =@YEARWEEK_TO
            AND p.ITEM_NO IN( '50048348') --p.ITEM_NO IN( '50057896','50048348','50293653','50059293')
        GROUP BY 
            p.COMPANY_NO, p.ITEM_NO, p.STORAGE_LOCATION
    )
        
    ,#DEMAND (COMPANY_NO, MATERIAL_NO, STORAGE_LOCATION, DEMAND_QTY) AS
    (
        SELECT  
            STRI_COMPANY_NO,
            STRI_ITEM_NO,
            STRI_STORAGE_LOCATION,
            SUM(STRI_QUANTITY * -1) AS DEMAND_QTY
        FROM 
            #MATERIAL m 
        INNER JOIN 
            [FUM_DWH].[dbo].[View_SCM_FACT_620_PAST_STOCK_RECEIPT_ISSUE] p ON m.MATERIAL_NO = p.STRI_ITEM_NO 
                                               AND p.STRI_STORAGE_LOCATION = m.STORAGE_LOCATION
        WHERE 
            STRI_COMPANY_NO = @COMPANY 
            AND CONCAT(STRI_YEAR, FORMAT( STRI_WEEK, '00')) BETWEEN @YEARWEEK_FROM AND @YEARWEEK_TO
            AND STRI_DEBIT_CREDIT = 'H' --nur Abgänge werten
        GROUP BY 
            STRI_ITEM_NO, STRI_COMPANY_NO, STRI_STORAGE_LOCATION
    )
    , #RECEIPT(COMPANY_NO, MATERIAL_NO, STORAGE_LOCATION, RECEIPT_QTY) AS
    (
        SELECT  
            STRI_COMPANY_NO,
            STRI_ITEM_NO,
            STRI_STORAGE_LOCATION,
            SUM(STRI_QUANTITY) AS RECEIPT_QTY
        FROM 
            [FUM_DWH].[dbo].[View_SCM_FACT_620_PAST_STOCK_RECEIPT_ISSUE] p 
        INNER JOIN 
            #MATERIAL m ON p.STRI_ITEM_NO = m.MATERIAL_NO 
                        AND p.STRI_STORAGE_LOCATION = m.STORAGE_LOCATION
        WHERE 
            STRI_COMPANY_NO = @COMPANY
            AND CONCAT(STRI_YEAR, FORMAT(STRI_WEEK, '00')) BETWEEN      @YEARWEEK_FROM AND @YEARWEEK_TO
            AND STRI_DEBIT_CREDIT = 'S' --nur Zugänge werten 
        GROUP BY 
            STRI_ITEM_NO, STRI_COMPANY_NO,STRI_STORAGE_LOCATION
    )
    ,#DEMAND_FUT (MATERIAL_NO, STORAGE_LOCATION, DEMAND_QTY, DEMAND_VAL) AS 
    (
        SELECT 
            [ITEM_NO], s.STORAGE_LOCATION,
            SUM([QUANTITY]) * -1 AS DEMAND_QTY,
            SUM([VALUE]) * -1 AS DEMAND_VAL
        FROM 
            [FUM_DWH].[dbo].[View_SCM_FACT_630_FUTURE_STOCK_RECEIPT_ISSUE] s 
        INNER JOIN 
            #MATERIAL m ON m.MATERIAL_NO = s.ITEM_NO 
                        AND m.STORAGE_LOCATION = s.STORAGE_LOCATION 
        WHERE 
            s.COMPANY_NO = @COMPANY
            AND TRANSACTION_DATE BETWEEN GETDATE() AND DATEADD(day, 31, GETDATE())
        GROUP BY 
            ITEM_NO, s.STORAGE_LOCATION
    )
    SELECT  
        m.MATERIAL_NO, 
        ISNULL(SUM(d.DEMAND_QTY), 1) AS PST_DEMAND_QTY, 
        ISNULL(SUM(r.RECEIPT_QTY), 1) AS PST_RECEIPT_QTY, 
        ISNULL(SUM(r.RECEIPT_QTY), 1) / ISNULL(SUM(d.DEMAND_QTY), 1) AS RATIO,
        SUM(m.INVENTORY_QTY) AS INVENTORY_QTY, 
        SUM(m.INVENTORY_VAL) AS INVENTORY_VAL, 
        ISNULL(SUM(f.DEMAND_QTY), 0) AS FUT_DEMAND_QTY, 
        ISNULL(SUM(f.DEMAND_VAL), 0) AS FUT_DEMAND_VAL,
        ISNULL(SUM(m.INVENTORY_QTY) - SUM(f.DEMAND_QTY), 0) AS  RMN_INVENTORY_QTY, 
        ISNULL(SUM(m.INVENTORY_VAL) - SUM(f.DEMAND_VAL), 0) AS RMN_INVENTORY_VAL
    FROM 
        #MATERIAL m 
    LEFT JOIN 
        #DEMAND d ON m.MATERIAL_NO = d.MATERIAL_NO 
                  AND m.STORAGE_LOCATION = d.STORAGE_LOCATION
    LEFT JOIN 
        #RECEIPT r ON m.MATERIAL_NO = r.MATERIAL_NO 
                   AND m.STORAGE_LOCATION = r.STORAGE_LOCATION
    LEFT JOIN 
        #DEMAND_FUT f ON m.MATERIAL_NO = f.MATERIAL_NO 
                      AND m.STORAGE_LOCATION = f.STORAGE_LOCATION
    GROUP BY 
        m.MATERIAL_NO 
    ORDER BY 
        m.MATERIAL_NO -- ISNULL(SUM(r.RECEIPT_QTY), 1) / ISNULL(SUM(d.DEMAND_QTY), 1) DESC
END

执行结果对比

  • 直接执行存储过程的结果:
    存储过程执行结果

  • DataTable中的结果:
    DataTable结果

已尝试将C#代码从异步改为同步,问题仍未解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:30:56