Понимание 'SqlParameter уже содержится в другой коллекции SqlParameterCollection'

У меня есть следующий фрагмент кода:

SqlParameter invidParam = new SqlParameter("@invid",obj.INVID);
SqlParameter prodParam = new SqlParameter("@prod", obj.PROD);
SqlParameter descrParam = new SqlParameter("@descr", obj.DESCR);      
SqlParameter qtyParam = new SqlParameter("@qty", 1);

if (SessionHelper.TryGetSession("curUser",out User user))
{
    SqlParameter useridParamCheck = new SqlParameter("@userid", user.Username);

    var queryResult = db.Database.SqlQuery<int>("EXEC CheckIfAlreadyInPR#invid#userid @invid, @userid", invidParam, useridParamCheck);
    var qty = queryResult.FirstOrDefault();

    if (qty == 0)
    {
        SqlParameter useridParamInsert = new SqlParameter("@userid", user.Username);
        var insertResult = db.Database.ExecuteSqlCommand("InsertIntoPR @invid, @prod, @descr, @userid, @qty", invidParam, prodParam, descrParam, useridParamInsert, qtyParam);
    }
    else if (qty > 0)
    {
        SqlParameter qtyParameter = new SqlParameter("@newqty", (qty + 1));
        SqlParameter userIdParamUpdate = new SqlParameter("@userid", user.Username);

        var updateResult = db.Database.ExecuteSqlCommand("UpdatePRQty#invid#userid#newqty @invid,@userid,@newqty",invidParam,userIdParamUpdate,qtyParameter);
    }
}

Моя программа запускается и обнаруживает исключение в строке var insertResult = db...

Пытаюсь понять, какой именно SqlParameter уже содержится в другой коллекции. Это потому, что параметр @userid уже использовался в предыдущем вызове хранимой процедуры?

Я объявил SqlParameter("@userid") 3 раза с разными именами переменных:

useridParamCheck, useridParamInsert, userIdParamUpdate

Это вызвало ошибку из-за того, что используется имя @userid? Если я использую @userid1, @userid2, @userid3, проблема будет решена? Или SqlParameter, который уже содержится, является некоторыми другими параметрами SQL, которые я объявил выше?

Спасибо

Вы не можете использовать один и тот же экземпляр SqlParamater для двух разных sql-команд. Посмотрите например invidParam

Tim Schmelter 03.07.2018 11:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
119
2

Ответы 2

Я собираюсь предположить, что invidparam - это параметр вашей проблемы, поскольку это единственный параметр, который, как я вижу, используется дважды. Один раз в db.Database.SqlQuery<int>("EXEC CheckIfAlreadyInPR#invid#userid @invid, @userid", invidParam, useridParamCheck); и снова в обоих экземплярах db.Database.ExecuteCommand().

Сама ошибка связана с многократным использованием объекта SqlParameter, а не с многократным использованием одного и того же имени параметра.

Я получал эту ошибку со следующим кодом

  var p = new System.Data.SqlClient.SqlParameter{ParameterName = "@p0", SqlDbType 
  SqlDbType.DateTime ,Value = ut.ReadyByDate, };
  var nextTasksResults = db.Database.SqlQuery<nextTask>(sql2, p);
  var isAny = nextTaskResults.Any() // error

Работа заключалась в отправке в массив и использовании этого

  var nextTasks = nextTasksResults.ToArray();
  var isAny = nextTasks.Any();

Другие вопросы по теме