已经声明了关于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参数添加到已经添加了参数的相同命令对象中。删除以下循环:
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)
...