1

私はこの仕事をしようとしています。

データベースにこのテーブルがあります。

items_table
------------------
Item_Name | Item ID
A     |  1
B     |  1
C     |  2
D     |  2
E     |  Null
F     |  
G     |  1
H     |  
I     |  Null

Select * from items_table where Item_ID is Null or Item_ID is empty

Loop(while there are items without Item_ID)

Check the count of first Item_ID

if first Item_ID count is less than 8
(update items_table values (current Item_ID ) where Item_Name is current row Item_Name )

otherwise check next Item_ID

If no Item_ID count is less than 8, insert max((Item_ID)+1) where Item_Name is current row Item_Name  

上の表の場合、このコードは次のようにする必要があります。

E、F、H、Group_ID が null または空です

ここで、これらすべてのアイテムに Item_ID を挿入する必要があります。

テーブル内のすべての既存の Item_ID の最初のチェック数。8 個未満のアイテムで item_ID が使用されている場合は、現在のアイテムにその Item_ID を挿入します。カウントが 8 未満の Item_ID がない場合は、新しい Item_ID を作成します。最大 Item_ID + 1 にする必要があります。

私はこれを書き込もうとしていますが、行をループして ID をカウントし、既存の ID または新しい ID を挿入する方法がわかりません。

 private static void FIllGroupID(string connectionString)
        {
            string queryStringNoGroupID =
                "Use Items select * from table_items_shelves where Item_ID is Null or Item_ID = '';";
            SqlCommand GetAllWithoutID = new SqlCommand(queryStringNoGroupID);


            DataTable DataTableAllWithoutID = new DataTable();

            SqlDataAdapter adapterAllWithoutID = new SqlDataAdapter(GetAllWithoutID);

            adapterAllWithoutID.Fill(DataTableAllWithoutID);

            foreach (DataRow row in DataTableAllWithoutID.Rows)
            {

            }

        }

既存の item_ids をループしてカウントするにはどうすればよいですか。count が 8 未満の場合は、現在の行に同じ ID を挿入するか、max(item_id)+1 を作成して挿入します。

4

1 に答える 1

2

では、質問から反対票を削除するのは誰でしょうか?

const string str = @"Data Source=localhost;Initial Catalog=Items;Integrated Security=True"; static void Main(string[] args) { const string connectionString = str;

            DataTable DataTableAllWithoutID = new DataTable();
#if !test
            string queryString = "select * from table_items_shelves;";
            SqlDataAdapter adapterAllWithoutID = new SqlDataAdapter(queryString, connectionString);
            adapterAllWithoutID.Fill(DataTableAllWithoutID);
            adapterAllWithoutID.Dispose();
            SqlConnection connection = new SqlConnection(connectionString);
            connection.Open();
            string insertString = "Update table_items_shelves Set Item_ID = @Item_ID where Item_Name = '@key';";
            SqlCommand insertCommand = new SqlCommand(insertString, connection);
            insertCommand.Parameters.Add("@Item_ID", SqlDbType.Int);
            insertCommand.Parameters.Add("@key", SqlDbType.NVarChar);
#else
            DataTableAllWithoutID.Columns.Add("Item_Name", typeof(string));
            DataTableAllWithoutID.Columns.Add("Item_ID", typeof(object));
            foreach (List<object> row in input)
            {
                DataRow newRow = DataTableAllWithoutID.Rows.Add();
                newRow.ItemArray = row.ToArray();
            }

#endif
            //this code will get empty items
            List<DataRow> nullOrEmpty = DataTableAllWithoutID.AsEnumerable()
               .Where(x => x.Field<object>("Item_ID") == null)
               .ToList();
            //this creates a dictionary of valid items
            Dictionary<int, List<DataRow>> dict = DataTableAllWithoutID.AsEnumerable()
                .Where(x => x.Field<object>("Item_ID") != null)
                .GroupBy(x => x.Field<object>("Item_ID"), x => x)
                .ToDictionary(x => Convert.ToInt32(x.Key), x => (List<DataRow>)x.ToList());
            //create IEnumerator for the null items
            IEnumerator<DataRow> emptyRows = nullOrEmpty.GetEnumerator();
            Boolean noMoreEmptyRows = false;
            if (emptyRows != null)
            {
                foreach (int key in dict.Keys)
                {
                    Console.WriteLine(key.ToString());
                    //get count of items            
                    int count = dict[key].Count;
                    int itemID = (int)key;
                    for (int index = count; count < 8; count++)
                    {
                        if (emptyRows.MoveNext())
                        {
                            //get an item from the null list                  
                            emptyRows.Current["Item_ID"] = itemID;
                            insertCommand.Parameters["@Item_ID"].Value = itemID;
                            insertCommand.Parameters["@key"].Value = emptyRows.Current["Item_Name"];
                            insertCommand.ExecuteNonQuery();
                            Console.WriteLine("current item ID " + itemID);
                            Console.WriteLine("current count " + count);
                            //Console.ReadKey();
                        }//end if
                        else
                        {
                            noMoreEmptyRows = true;
                            break;
                        }//end else
                    }//end for
                    if (noMoreEmptyRows)
                        break;
                }//end foreach
                if (!noMoreEmptyRows)
                {
                    //increment key to one greater than max value
                    int maxKey = dict.Keys.Max() + 1;
                    int count = 0;
                    while (emptyRows.MoveNext())
                    {
                        //get an item from the null list                  
                        emptyRows.Current["Item_ID"] = maxKey.ToString();
                        insertCommand.Parameters["@Item_ID"].Value = maxKey.ToString();
                        insertCommand.Parameters["@key"].Value = emptyRows.Current["Item_ID"];

                            insertCommand.ExecuteNonQuery();

                          count++;
                        if (count == 8)
                        {
                            maxKey++;
                            count = 0;
                        }
                    }
                }
            }//end if
#if test
            foreach (DataRow row in DataTableAllWithoutID.Rows)
            {
                Console.WriteLine("Item_Name : {0}  Item ID :   {1}", 
                    row["Item_Name"], row["Item_ID"]);
            }
#endif

            FIllGroupID(str);
            Console.ReadKey();

        }
于 2013-10-22T20:38:32.487 に答える