已经声明了获取有关SQL参数的错误

时间:2013-05-29 19:17:03

标签: c# sql-server

我有一个方法可以添加到mapper表中。只有3列:Identity字段,CategoryId和UnitId。后两个是另外两个表的外键。

List I包含其中的所有三列(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'已经声明。变量名在查询批处理或存储过程中必须是唯一的。”

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

1 个答案:

答案 0 :(得分: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)
...