У меня есть следующий фрагмент кода:
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





Я собираюсь предположить, что 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();
Возможный дубликат SqlParameter уже содержится в другой коллекции SqlParameterCollection - обманывает ли using () {}?