了解“该SqlParameter已被另一个SqlParameterCollection包含”

时间:2018-07-03 08:43:47

标签: c# asp.net sql-server stored-procedures

我有以下代码:

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参数?

谢谢

2 个答案:

答案 0 :(得分:3)

我建议invidparam是您的问题参数,因为它是我看到的唯一被两次使用的参数。在db.Database.SqlQuery<int>("EXEC CheckIfAlreadyInPR#invid#userid @invid, @userid", invidParam, useridParamCheck);中一次,在db.Database.ExecuteCommand()的两个实例中一次。

错误本身与一个SqlParameter对象被多次使用有关,而不是同一参数名称被多次使用。

答案 1 :(得分:0)

我使用以下代码遇到此错误

  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();