0

我有一种方法可以添加到映射器表中。只有 3 列:标识字段、CategoryId 和 UnitId。后两个是其他两个表的外键。

我拥有的列表包含其中的所有三列(CategoryUnit 只是一个存储数据的类)。

我通过 C# 将它添加到数据库中。这就是我所拥有的。

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’已被声明。变量名在查询批处理或存储过程中必须是唯一的。”

我以前有类似的方法,但它们没有任何问题。不太清楚该怎么做。顺便说一句,所有数据都被清除重复。任何想法,将不胜感激。

4

1 回答 1

2

问题是您将循环内的 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)
...
于 2013-05-29T19:24:00.427 回答