【发布时间】:2018-08-03 09:48:40
【问题描述】:
提前,我很欣赏 Stackoverflow 上有很多与存储过程相关的问题和答案,我知道是因为在过去的几天里,我已经阅读了大量的问题,但我仍然无法理解创建过程将值返回到我的视图模型的存储过程。
这个问题分为两部分:
- 为什么我的代码没有成功运行,而是返回 -1 ?
- 如果在您的帮助下我解决了第一个问题,我该如何从存储过程中获取返回的数据到我的视图模型列表中
我非常感谢社区可以给我的任何帮助...
- 数据库名称是
Discovery - 表名是
Person - 存储过程名称是
uspGetOrgChart
我的桌子
CREATE TABLE Discovery.dbo.Person
(
ADID nvarchar(50) NOT NULL,
First_Name nvarchar(50) NOT NULL,
Last_Name nvarchar(50) NOT NULL,
Report_To_ADID nvarchar(50) NULL,
Position_ID int NULL,
Role_ID int NULL,
IGEMS nvarchar(50) NULL,
DOB date NULL,
Start_Date date NULL,
Cost_Code nvarchar(50) NULL,
PRIMARY KEY CLUSTERED (ADID),
CONSTRAINT FK_Person_Position1
FOREIGN KEY (Position_ID) REFERENCES dbo.Position (Position_ID),
CONSTRAINT FK_Person_Role
FOREIGN KEY (Role_ID) REFERENCES dbo.Role (Role_ID)
)
ON [PRIMARY]
GO
我的存储过程目前如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[uspGetOrgChart]
@ContactID VARCHAR(100) = 'NOE1WWD'
AS
BEGIN
SET NOCOUNT ON;
--grab id of @contactid
DECLARE @Test varchar(36)
SELECT @Test = (SELECT ADID FROM Person c1 WHERE c1.ADID = @ContactID)
;WITH StaffTree AS
(
SELECT
c.ADID,
c.First_Name,
c.Last_Name,
c.Report_To_ADID,
c.Report_To_ADID as Manager_ID,
cc.First_Name AS Manager_First_Name,
cc.Last_Name as Manager_Last_Name,
cc.First_name + ' ' + cc.Last_name AS [ReportsTo],
c.First_Name + ' ' + c.Last_Name as EmployeeName,
1 AS LevelOf
FROM
Person c
LEFT OUTER JOIN
Person cc ON c.Report_To_ADID = cc.ADID
WHERE
c.ADID = @Test
OR (@Test IS NULL AND c.Report_To_ADID IS NULL)
UNION ALL
SELECT
s.ADID,
s.First_Name,
s.Last_Name,
s.Report_To_ADID,
t.ADID,
t.First_Name,
t.Last_Name,
t.First_Name + ' ' + t.Last_Name,
s.First_Name + ' ' + s.Last_Name,
t.LevelOf + 1
FROM
StaffTree t
INNER JOIN
Person s ON t.ADID = s.Report_To_ADID
WHERE
s.Report_To_ADID = @Test
OR @Test IS NULL
OR t.LevelOf > 1
)
SELECT * FROM StaffTree
END
我已经测试过,上面的过程按我的预期工作,并返回以下列:
ADID
First_Name
Last_Name
Report_To_ADID
Manager_ID
Manager_First_Name
Manager_Last_Name
ReportsTo
EmployeeName
LevelOf
我的视图模型叫做vmNewOrgChart:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Discovery.ViewModels
{
public class vmNewOrgChart
{
public string ADID { get; set; }
public string First_Name { get; set; }
public string Last_Name { get; set; }
public string Report_To_Adid { get; set; }
public string Manager_ID { get; set; }
public string Manager_First_Name { get; set; }
public string Manager_Last_Name { get; set; }
public string ReportsTo { get; set; }
public string EmployeeName { get; set; }
public int LevelOf { get; set; }
}
}
这是我开始完全卡住的地方
public IActionResult Orgchart(string id)
{
var personIdParam = new SqlParameter("@ContactID", SqlDbType.VarChar);
personIdParam.Value = id;
var result = _context.Database.ExecuteSqlCommand("exec uspGetOrgChart", personIdParam);
}
上面的代码运行了,但是结果的值为-1,这意味着它什么也没返回或有错误?
非常感谢您的帮助
德里克
【问题讨论】:
-
您使用的是哪个 dbms? (该代码是特定于产品的。)
-
如果没有行受到影响,存储过程将返回
-1(因为您使用的是SET NOCOUNT ON,相关问题here)。如果要将结果投影到模型类中,请改用_context.Database.SqlQuery<TResult>("exec uspGetOrgChart", personIdParam);。 -
我用的是SQLServer,我用的管理软件是MS SQL Studio
-
为什么不使用带有表格结果的函数并对其进行选择?像这样:_context.Database.SqlQuery
("SELECT Name, Login FROM Users()").ToList();更多关于这些功能的信息:stackoverflow.com/questions/440308/…
标签: c# sql-server stored-procedures asp.net-core-mvc viewmodel