Nano Hash - криптовалюты, майнинг, программирование

Вызов хранимой процедуры с параметрами

У меня есть хранимая процедура, которая возвращает значение, а не набор данных, и у меня проблемы с ее работой с EF4.

Я видел это: http://dotnet.dzone.com/news/how-retrieve-stored-procedure

Вот что я сделал: добавил в модель процедуру и импортировал функцию.

Первая проблема, с которой я столкнулся, заключалась в том, что параметры в моей процедуре называются как @_Parameter_in. Это заставило EF ввести их как p_Parameter_in, потому что это не будет работать с символом подчеркивания в качестве первого символа. Затем, когда я вызвал хранимую процедуру, я вижу в вызове SQL Profiler, что она ищет @p_Parameter_in, и, конечно, с этим возникла проблема.

Сейчас переименовал параметры и заглянул в SQL Trace - все отлично выглядит и работает. Проблема в том, что я не могу получить значение. Вот как выглядит мой код:

System.Data.Objects.ObjectParameter newKey = new System.Data.Objects.ObjectParameter("NewKey_out", typeof(Int32));
newKey.Value = 0;
context.GetNextSurrogateKey_v2("tTest", newKey);

После вызова newKey.Value это всегда 0 или любое другое значение, которое я установил. Это не возвращает значение. Я подозреваю, что моя проблема связана с тем, как я импортирую функцию. Я использую скаляры и тип данных Int32. «Создать новый сложный тип» у меня почему-то отключено. У кого-нибудь была такая проблема?

21.02.2011

Ответы:


1

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

Я полагаю, вы хотите определить новую функцию в EDM и указать ее на хранимую процедуру. У быстрого поиска в Google есть это потенциальное решение: http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values

ХТН

21.02.2011
  • Это то, на что стоит обратить внимание, я могу просто изменить процедуру, чтобы она работала так. В настоящее время я не возвращаю скалярное значение. Я присваиваю значение параметру OUTPUT в хранимой процедуре. 21.02.2011
  • Это тоже не работает. Я получаю сообщение об ошибке Средство чтения данных, возвращенное поставщиком данных хранилища, не имеет достаточного количества столбцов для запрошенного запроса. 21.02.2011
  • Хорошо, я взялся за работу. Разместив select @MyValue в конце хранимой процедуры. Вопрос все еще открыт, можно ли использовать параметры OUTPUT с EF. 21.02.2011
  • Просто для ясности: помечен ли newkey_out ключевым словом «выход» в хранимой процедуре и выбрано ли для него значение? 21.02.2011
  • да, это было отмечено при выходе. Эта хранимая процедура существовала еще со времен ADO и LINQtoSQL. В итоге я сделал SELECT newkey_out в конце процедуры (получив набор данных по существу) и использовал скалярный тип вывода в EF. Это исправило это, но мне это не нравится :( Я бы хотел, чтобы был способ назвать это так, как было. С именами параметров, как это было. У нас есть тонны кода на стороне БД, и соглашение об именах было @_Parameter_in и @_Parameter_out. EF не будет работать с именами Я отмечу ваш ответ, так как я заставил его работать благодаря вашей ссылке 22.02.2011
  • @ christo8989 да, я тоже вижу что-то не так. Боюсь, это не мой сайт — он зарегистрирован уже много лет (who.is/whois/devtoolshed.com), так что думаю, его как-то взломали. 21.03.2017
  • Снимок связанной статьи в этом ответе доступен здесь. https://web.archive.org/web/20110620073108/http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values 22.06.2017

  • 2

    Проблема в том, что EF обрабатывает выходные параметры после того, как datareader заканчивает чтение. Обычно это происходит после вызова функции DataBind(). У меня была такая же проблема с более длительными процедурами обработки. Я решаю это, используя функцию .ToList() в ObjectResult.

    var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));    
    var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList();
    this.ProductsCount = (int?)rowsCount.Value;
    

    Отдельные строки или значения вы, вероятно, можете решить с помощью функции FirstOrDefault().

    23.01.2012

    3

    У меня была такая же проблема, как описал Ян Ремунда. Кто-то изменил тип возвращаемого значения с Integer на Entity.Core.Objects.ObjectResult(of Integer?), в результате чего всегда ничего не возвращалось.

    Для нас решение состояло в том, чтобы заставить EF читать возврат сохраненного процесса, добавив функцию .FirstOrDefault() к возврату.

    18.08.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..