【问题标题】:Passing an array/table to stored procedure through Entity Framework通过实体框架将数组/表传递给存储过程
【发布时间】:2011-07-28 14:53:02
【问题描述】:

我正在使用带有 C# 的实体框架来制作 Silverlight 应用程序。我已经编写了一些执行数据库密集型操作的存储过程,我需要在传递一些参数后从实体框架中调用它们。在其中一个步骤中,用户选择他们需要更多详细信息的项目列表。需要将此项目列表(以整数 ID 数组的形式)传递给存储过程,以检索有关这些 ID 的更多信息。如何将此参数传递给存储过程?

【问题讨论】:

标签: c# sql-server entity-framework


【解决方案1】:

您不能使用实体框架将表值参数传递给 SQL。

您可以做的是创建一个分隔字符串,如"1|2|3|4",并在 SQL 中创建一个拆分函数,该函数将返回一个表。

CREATE FUNCTION dbo.Split
(
    @RowData nvarchar(2000),
@SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(
Id int identity(1,1),
Data nvarchar(100)
) 
AS  
BEGIN 
Declare @Cnt int
Set @Cnt = 1

While (Charindex(@SplitOn,@RowData)>0)
Begin
    Insert Into @RtnValue (data)
    Select 
        Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

    Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
    Set @Cnt = @Cnt + 1
End

Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))

Return
END

然后,如果您需要根据传递给您的 proc 的分隔字符串中的内容从表中选择所有项目:

SELECT * FROM SomeTable WHERE Id IN (SELECT Id FROM dbo.Split(@DelStr, '|'))

【讨论】:

  • 谢谢。是否可以将表传递给实体框架?
  • 我希望如此。似乎 SQL 团队创建了一堆我永远无法使用的非常简洁的功能,因为像 Entity Framework 和 Linq to Sql 这样的团队从不允许使用它们……如果我直接接触 ADO.net,我会被诅咒的再次:)
  • 我确实有一个问题。 Colin Desmond stackoverflow.com/questions/5979706/… 是如何设法将用户定义的表类型添加到他的 EF 模型中的?
  • 我认为这可能会受到 SQL 注入攻击,依赖于参数输入的动态 SQL 总是让我害怕。
  • 其实用户定义的类型也是可以的。
【解决方案2】:

如果您使用的是 SQL Server,我假设是这种情况,您可以创建使用表值参数来执行您想要的操作。使用表值参数可防止您在存储过程中解析输入参数,并通过消除使用动态 SQL 来消除 SQL 注入攻击的威胁。

这是一篇很棒的博客文章,介绍了如何做你想做的事。

Using Table-Valued Parameters in SQL Server 2008 and C#

【讨论】:

  • 根据 Dismissle 表值参数可能不是实体框架的选项。如果您选择解析 varchar 作为输入,请务必小心。
【解决方案3】:

this 是您要找的吗?

【讨论】:

  • 这个地址如何作为参数传入数组/列表项?
  • 答案应包含更多信息,而不仅仅是指向另一个网站的链接。
猜你喜欢
  • 2016-01-09
  • 2016-02-19
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
相关资源
最近更新 更多