DbContext ExecuteSqlCommand — хранимая процедура с табличным значением

У меня проблема с вызовом хранимой процедуры из моего DbContext. Хранимая процедура принимает параметр с табличным значением.

Синтаксис процедуры:

ALTER PROCEDURE dbo.SaveResults
  @resultID int,
  @positiveResults AS dbo.PositiveResultTypes READONLY
AS

У меня есть DataTable(dtResults), заполненная допустимыми значениями для типа таблицы.

Мой код вызова:

var resultsParam = new SqlParameter("@positiveResults", SqlDbType.Structured);
resultsParam.Value = dtResults;
resultsParam.TypeName = "PositiveResultTypes";

db.Database.ExecuteSqlCommand(
    "dbo.SaveResults", 
    new SqlParameter("@resultID", id),
    resultsParam);

Это терпит неудачу с:

Процедура или функция «SaveResults» ожидает параметр «@resultID», который не был предоставлен.

Здесь допустима переменная id, а не null (int, значение 1).

Я попытался изменить синтаксис на "dbo.SaveResults @resultID @positiveResults" в коде вызова без изменения результата.

Почему не видит этот параметр?

ИЗМЕНИТЬ

SQL Profiler показывает, что этот параметр проходит правильно...

declare @p3 dbo.PositiveResultTypes 
insert into @p3 values(N'1')
insert into @p3 values(N'4')
insert into @p3 values(N'6')

exec sp_executesql N'dbo.SaveResults',N'@positiveResults [PositiveResultTypes] READONLY,@resultID int',@positiveResults=@p3,@resultID=1

Однако этот синтаксис для EXEC несколько неверен. Когда я выполняю это для базы данных, я получаю тот же результат:

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)
Msg 201, Level 16, State 4, Procedure SaveResults, Line 0
Procedure or function 'SaveResults' expects parameter '@resultID', which was not supplied.

person Patrick    schedule 23.09.2014    source источник


Ответы (2)


Сделайте resultsparameter массивом параметров, добавьте в него оба ваших параметра. Затем передайте параметр в методе ExecuteSqlCommand.

Упомянутая ошибка проявляется из-за того, что ему передаются два параметра sql, в то время как ему может быть передан только один параметр sql.

person Satyajit    schedule 23.09.2014
comment
Я попытался передать его следующим образом: новый объект[] {resultsParam, new SqlParameter(@resultID, id)}) в качестве второго параметра, но получил тот же результат. См. редактирование, трассировка профиля на SQL кажется правильной? - person Patrick; 23.09.2014

person    schedule
comment
Я пытаюсь сделать это с помощью db.Database.ExecuteSqlCommand() (EF DbContext), как показано, а не с необработанным ADO.Net, хотя, если мне придется пойти по этому пути, я это сделаю. - person Patrick; 23.09.2014
comment
@Patrick Патрик Я думаю, вам просто может понадобиться перейти на этот более низкий уровень, однако вы можете сделать одну вещь: вы можете использовать db.Database.Connection в качестве источника подключения для вашей SqlCommand. - person Scott Chamberlain; 23.09.2014