Передача массива / таблицы в хранимую процедуру через Entity Framework - PullRequest
11 голосов
/ 28 июля 2011

Я использую Entity Framework с C # для создания приложения Silverlight.Я написал несколько хранимых процедур, которые выполняют операции с базами данных, и мне нужно вызвать их из Entity Framework после передачи некоторых параметров.На одном из шагов пользователи выбирают список элементов, для которых им потребуется более подробная информация.Этот список элементов (в виде массива целочисленных идентификаторов) необходимо передать в хранимую процедуру для получения дополнительной информации об этих идентификаторах.Как передать этот параметр хранимой процедуре?

Ответы [ 3 ]

13 голосов
/ 28 июля 2011

Невозможно передать табличные параметры в SQL с помощью Entity Framework.

Что вы можете сделать, это создать строку с разделителями, например "1|2|3|4", и создать функцию Split в 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

Затем, если вам нужно что-то сделать, например, выбрать все элементы из таблицы на основе того, что в строке с разделителями, переданной в ваш процесс:

SELECT * FROM SomeTable WHERE Id IN (SELECT Id FROM dbo.Split(@DelStr, '|'))
4 голосов
/ 28 июля 2011

Если вы используете SQL Server, что, как я полагаю, имеет место, вы можете использовать параметр с табличным значением, чтобы делать то, что вы хотите. Использование табличного параметра предотвращает синтаксический анализ входного параметра в хранимой процедуре и устраняет угрозу атаки с использованием SQL-инъекций, исключая использование динамического SQL.

Вот отличная статья в блоге, в которой рассказывается, как делать то, что вы хотите сделать.

Использование табличных параметров в SQL Server 2008 и C #

0 голосов
/ 28 июля 2011

Это это то, что вы искали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...