静态数据不返回值的存储过程

时间:2018-07-10 14:13:53

标签: c# sql-server linq model-view-controller

我有以下存储过程:

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没有得到正确的数据?我看不到错误

enter image description here

3 个答案:

答案 0 :(得分:1)

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

{{3}}

将您的电话转换为使用此电话:

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

答案 1 :(得分:0)

尝试ExecuteSqlCommand:

  _context.Database.ExecuteSqlCommand("myproc");

或带有返回参数:

 SqlParameter stmt = new SqlParameter("@stmt", System.Data.SqlDbType.Varchar);
 stmt.Direction = System.Data.ParameterDirection.Output;

 _context.Database.ExecuteSqlCommand("myproc @stmt out", stmt);
 var qry = stmt.value;

确保在该过程中也放入out参数。

答案 2 :(得分:0)

无需更改任何内容,一切都很好。我只需要在变量上添加{ get; set; }。...

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