【发布时间】:2018-02-19 12:25:11
【问题描述】:
我使用的是 EF 代码优先方法,并且我使用迁移创建了存储过程,如下所示:
public override void Up()
{
Sql(@"CREATE TYPE IdsList AS TABLE
(
Id Int
)
GO
Create Procedure getChildIds(
@IdsList dbo.IdsList ReadOnly
)
As
Begin
WITH RecursiveCTE AS
(
SELECT Id
FROM dbo.PhysicalObjects
WHERE ParentId in (Select * from @IdsList)
--Where Id=108
UNION ALL
SELECT t.Id
FROM dbo.PhysicalObjects t
INNER JOIN RecursiveCTE cte ON t.ParentId = cte.Id
)
SELECT * FROM RecursiveCTE
End");
}
public override void Down()
{
Sql(@"Drop Type IdsList
Go
Drop Procedure getChildIds");
}
现在如果我去 sql server management studio 并执行以下脚本:
Declare @Ids dbo.IdsList
Insert into @Ids
SELECT 1
Exec getChildIds @Ids
它将成功执行,但现在我正在尝试执行该存储过程,如下所示:
var idsList = new SqlParameter {ParameterName = "idsList", Value = new int[] { 1,2,3,4,5} };
var idParams = new SqlParameter("idParams", SqlDbType.Structured)
{
Direction = System.Data.ParameterDirection.Output
};
var results = dbContext.Database.SqlQuery<int>("getChildIds @idsList, @idParams out", idsList,idParams) ;
var idsResult = (List<int>)idParams.Value;
它不返回任何东西。
那么我怎样才能使用 Table 类型的输入和输出参数来执行存储过程呢?
【问题讨论】:
-
我在您的 SP 中没有看到
OUTPUT参数;只有一个输入参数 (@IdsList)。相反,您的 SP 正在返回一个数据集。 -
我应该修改我的存储过程吗?
-
是的,你需要声明一个 OUTPUT 变量。
-
我认为这里不需要使用
OUTPUT参数。就个人而言,我会改为更改您的应用程序 (C#) 代码以期望返回DataTable。您可以使用OUTPUT参数,但这似乎是不必要的复杂性,无论如何您都可能在应用程序中将其转换为Datatable。 -
老实说,我不太擅长编写 C#。我可以很好地阅读它,因此为什么我可以看到问题,但是,我总是用 VB.Net 编写的(要阅读,语言并不太相似)。我还没有处于需要学习/使用 C# 的位置,因此我还没有学会如何编写它。
标签: c# sql-server entity-framework stored-procedures