У меня есть хранимая процедура, которая имеет три параметра, и я пытаюсь использовать следующее, чтобы вернуть результаты:
context.Database.SqlQuery<myEntityType>("mySpName", param1, param2, param3);
Сначала я попытался использовать SqlParameter
объекты в качестве параметров, но это не сработало и выдал SqlException
следующее сообщение:
Процедура или функция «mySpName» ожидает параметр «@ param1», который не был предоставлен.
Итак, мой вопрос, как вы можете использовать этот метод с хранимой процедурой, которая ожидает параметры?
Спасибо.
c#
sql
ado.net
linq-to-entities
entity-framework-ctp5
ElectricSheep
источник
источник
Ответы:
Вы должны предоставить экземпляры SqlParameter следующим образом:
источник
DbNull.Value
вместо нуля проблему?Также вы можете использовать параметр "sql" в качестве спецификатора формата:
источник
ProcName @optionalParam1 = @opVal1, @optionalParam2 = @opVal2
Пример, который работает:ProcName @optionalParam1 = {0}, @optionalParam2 = {1}
Это решение (только) для SQL Server 2005
Вы, ребята, спасатели, но, как сказал @Dan Mork, вам нужно добавить EXEC в смесь. Что меня сбило с толку:
:
источник
exec
, но я могу подтвердить, что получаю исключение, если опущу его.exec
ключевое слово. +1 за удаление символа @ в параметрах, что всегда портит меня.//Или
//Или
//Или
источник
Большинство ответов являются хрупкими, потому что они зависят от порядка параметров SP. Лучше назвать параметры хранимой процедуры и дать им параметризованные значения.
Для того, чтобы использовать именованные параметры при вызове вашего SP, не беспокоясь о порядке параметров
Использование именованных параметров SQL Server с ExecuteStoreQuery и ExecuteStoreCommand
Описывает лучший подход. Лучше, чем ответ Дэн Морк здесь.
Например:
источник
sqlParams
переменнойили
или
или
источник
Я использую этот метод:
Мне это нравится, потому что я просто добавляю Guids и Datetimes, а SqlQuery выполняет все форматирование для меня.
источник
@Tom Halladay ответ правильный, с упоминанием, что вы shopuld также проверяете на нулевые значения и отправляете DbNullable, если параметры равны нулю, как если бы вы получили исключение, подобное
Параметризованный запрос «...» ожидает параметр «@parameterName», который не был предоставлен.
Как-то так мне помогло
(информация о методе указана по адресу https://stackoverflow.com/users/284240/tim-schmelter )
Тогда используйте это как:
или другое решение, более простое, но не общее:
источник
У меня было то же сообщение об ошибке, когда я работал с вызовом хранимой процедуры, которая принимает два входных параметра и возвращает 3 значения, используя инструкцию SELECT, и я решил проблему, как показано ниже в EF Code First Approach.
ОБНОВЛЕНИЕ : похоже, что в SQL SERVER 2005 отсутствует ключевое слово EXEC создает проблему. Поэтому, чтобы позволить ему работать со всеми версиями SQL SERVER, я обновил свой ответ и добавил EXEC в строке ниже
источник
Я сделал мой с EF 6.x так:
Не удваивайте sqlparameter, некоторые люди обжигаются, делая это со своей переменной
источник