0

マッパーテーブルに追加する方法があります。列は、Identity フィールド、CategoryId、および UnitId の 3 つだけです。後の 2 つは、他の 2 つのテーブルへの外部キーです。

私が持っているリストには、3 つの列がすべて含まれています (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' は既に宣言されています。変数名はクエリ バッチまたはストアド プロシージャ内で一意である必要があります。」

同様の以前の方法がありますが、問題はありませんでした。これをどうするかはよくわかりません。ところで、すべてのデータは重複のためにスクラブされます。どんなアイデアでも大歓迎です。

4

1 に答える 1

2

問題は、ループ内の SQL パラメーターを、既にパラメーターが追加されている同じコマンド オブジェクトに追加していることです。次のループを削除します。

foreach (SqlParameter sqlParam in sqlParams)

次に、パラメーターを追加する代わりに、パラメーター値を設定します。

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

次に、より大きな for ループに入る前に、コマンドにパラメーターを 1 回追加します。

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 に答える