首页 > 解决方案 > 具有静态数据的存储过程不返回值

问题描述

我有以下存储过程:

CREATE PROCEDURE [dbo].[usp_GetReportLevel]
AS
    DECLARE @TEMP TABLE (BK_REPORT_LEVEL INT, REPORT_LEVEL_NAME VARCHAR(MAX))

    INSERT INTO @temp 
    VALUES (0, 'Client Group'), (1, 'Client'), (2, 'Related Matter'), (3, 'Matter')

    SELECT * 
    FROM @TEMP 
GO

实体数据库是这样的:

    public IEnumerable<usp_GetReportLevel_Result> usp_GetReportLevel()
    {
        //const string storedProcedure = "usp_GetReportLevel";

        var result = Database.SqlQuery<usp_GetReportLevel_Result>($"EXEC usp_GetReportLevel");
        return result;
    }

usp_GetReportLevel_Result 如下:

public class usp_GetReportLevel_Result
{
    [Column("BK_REPORT_LEVEL")]
    public int BK_REPORT_LEVEL;
    [Column("REPORT_LEVEL_NAME")]
    public string REPORT_LEVEL_NAME;
}

和构造函数中的 c# 代码从存储过程中选择列表项作为本节:

    List<SelectListItem> reportLevelList2= new List<SelectListItem>();

    var reportLevelusp = context.usp_GetReportLevel();

    foreach (var reportLevel in reportLevelusp)
    {
        SelectListItem lvl = new SelectListItem()
        {
            Text = reportLevel.REPORT_LEVEL_NAME,
            Value = reportLevel.BK_REPORT_LEVEL.ToString()
        };
        reportLevelList2.Add(lvl);
    }

    ReportLevelList = reportLevelList2;

现在,如果我调试该代码,foreach将输入 4 次,告诉我它正在正确读取数据库值,但值BK_REPORT_LEVELREPORT_LEVEL_NAME始终分别为 0 和 null。

为什么会这样?如果我在数据库上执行存储过程,它会返回我想要的结果,为什么Linq没有得到正确的数据?我看不到错误

在此处输入图像描述

标签: c#sql-serverlinqmodel-view-controller

解决方案


我之前在从 SQL SP 中选择临时表或表变量时遇到过问题。取决于您正在处理的 SQL Server 版本。您需要使用结果集:

https://www.mssqltips.com/sqlservertip/2356/overview-of-with-result-sets-feature-of-sql-server-2012/

转换您的呼叫以使用它:

EXEC usp_GetReportLevel
WITH RESULT SETS
(
 ( 
  BK_REPORT_LEVEL INT, 
  REPORT_LEVEL_NAME varchar(max)
 ) 
) 

推荐阅读