已经声明了关于SQL参数的错误

本文关键字:SQL 参数 错误 声明 | 更新日期: 2023-09-27 18:15:51

我有一个方法,我添加到一个映射表。只有3列:Identity field、CategoryId和UnitId。后两个是另外两个表的外键。

我的List包含了所有三列(CategoryUnit只是一个存储数据的类)。

我通过c#将其添加到DB。

private static void ExecuteInsertsIntoCategory_Unit_MappingForSubCategories(
            string sqlInsertStatement, SqlParameterCollection sqlParams,
            List<CategoryUnit> categoryUnitData)
{
            try
            {
                var counter = 0;
                categoryUnitData = categoryUnitData.OrderBy(cud => cud.UnitId)
                                     .ToList();
                foreach (var categoryUnit in categoryUnitData)
                {
                    //Get the parent category
                    var parentCategoryId = categoryUnit.CategoryId;
                    //Go through the categories and get the children of
                    //the parent category
                    var categoryIds = categoryData.Where(cd =>
                                       cd.ParentCategoryId == parentCategoryId)
                                        .Select(cd => cd.CategoryId)
                                        .ToList();
                    //Get the unit
                    var unitId = categoryUnit.UnitId;
                    tempUnit = unitId;
                    if (categoryIds.Count > 0)
                    {
                        using (var sqlCommand =
                               new SqlCommand(sqlInsertStatement, sqlCon))
                        {
                            foreach (var categoryId in categoryIds)
                            {
                                tempCategory = categoryId;
                                foreach (SqlParameter sqlParam in sqlParams)
                                {
                                    switch (sqlParam.ParameterName)
                                    {
                                        case "@CategoryId":
                                            sqlCommand.Parameters
                                                      .AddWithValue
                                                      (sqlParam.ParameterName,
                                                      categoryId);
                                            break;
                                        case "@UnitId":
                                            sqlCommand.Parameters
                                                      .AddWithValue
                                                      (sqlParam.ParameterName,
                                                      unitId);
                                            break;
                                    }
                                }
                                //Both must exist in order to add a record
                                if (categoryId != 0 && unitId != 0)
                                {
                                    //Execute sql and clear out
                                    sqlCon.Open();
                                    sqlCommand.ExecuteNonQuery();
                                    sqlCon.Close();
                                    counter++;
                                }
                            }
                        }
                    }
                }
                Console.WriteLine(counter + " row(s) added to "
                                          + "Category_Unit_Mapping for "
                                          + "Subcategories");
            }
            //Something went wrong
            catch (Exception ex)
            {
                Console.WriteLine("Error in SQL Insert Into "
                                 + "Category_Unit_Mapping for Subcategories: "
                                 + ex.Message);
            }
            //Close out sql connection
            finally
            {
                if (sqlCon.State != ConnectionState.Closed) sqlCon.Close();
            }
        }

当我的代码到达这个方法时,我得到以下错误:

"变量名'@CategoryId'已被声明。变量名在查询批处理或存储过程中必须是唯一的。"

我以前有类似的方法,但他们没有任何问题。我不太确定这是怎么回事。顺便说一句,所有数据都被清除了重复项。

已经声明了关于SQL参数的错误

问题是,您正在将循环内的SQL参数添加到已经添加了参数的相同命令对象中。删除以下循环:

foreach (SqlParameter sqlParam in sqlParams)

然后不添加参数,而是设置参数值:

sqlCommand.Parameters["@CategoryId"] = categoryId;
sqlCommand.Parameters["@UnitId"] = unitId;

然后在进入较大的for循环之前,向命令中添加一次参数:

using (var sqlCommand =
    new SqlCommand(sqlInsertStatement, sqlCon))
    {
        sqlCommand.Parameters.Add(sqlParams["@CategoryId"]);
        sqlCommand.Parameters.Add(sqlParams["@UnitId"]);
        foreach (var categoryId in categoryIds)
...