我有一个方法可以添加到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'已经声明。变量名在查询批处理或存储过程中必须是唯一的。”
我以前的方法类似,但没有任何问题。不太清楚该怎么做。顺便说一句,所有数据都被擦除重复。任何想法都将不胜感激。
答案 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)
...