c# - 具有静态数据的存储过程不返回值
问题描述
我有以下存储过程:
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_LEVEL
和REPORT_LEVEL_NAME
始终分别为 0 和 null。
为什么会这样?如果我在数据库上执行存储过程,它会返回我想要的结果,为什么Linq
没有得到正确的数据?我看不到错误
解决方案
我之前在从 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)
)
)
推荐阅读
- jq - 如何用jq输出时间戳
- javascript - 输入字段文本输入上的自定义古腾堡块错误
- java - 如何在构造函数的方法中不使用“this”
- .net - 数据视图开销
- python - 需要添加所有差异值,但针对特定的索引值范围
- dji-sdk - 如何从 dji mavic 2 企业镜像中获取热数据?
- sql - Postgres:如何在 Have 子句中进行 NULL 友好的 MIN 过滤以准确选择一行?
- indexing - Cypher 数字索引和数组属性查询
- javascript - 访问使用 D3 制作的 SVG 的属性
- flutter - headerSliverBuilder 正在重建每次滚动并向服务器发出 api 调用如何停止它