Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: PatrickОтветов: 1

У меня проблема с вызовом хранимой процедуры из моего 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.

sql-serverentity-frameworktable-valued-parametersdbcontext

Ответы

Ответ 1 · Satyajit

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы