C# 数据库更新重叠

本文关键字:重叠 更新 数据库 | 更新日期: 2023-09-27 18:34:47

我有 2 个列表,都包含代表各自球队中球员评分的整数。

Ex:
team1ListOfRatings: 9,1,4
team2ListOfRatings: 6,2,4

我希望将这些输入到我拥有的访问数据库中。但是,当我尝试输入它们时,如果与列表中的数字有任何相似之处(在上面显示的示例中,这是"4"(,那么第一个列表中的重复评级将分配给数据库中的团队 2。

它将产生以下结果:

Players in team 1: Ben (rating 9), Will(rating 1) 
Players in team 2: Philip(rating 6), Sam(rating 2), Bert(rating 4), Gary(rating 4)

从上面的例子中,很明显 Gary 需要在第一个团队中,但是因为我使用 for 循环,它会将任何重复项重新分配给最近 for 循环中使用的团队。这是我为此使用的代码:

// this adds the players to the database temporarily without a team
for (int i = 0; i < numberOfPlayers; i++)
{
    OleDbConnection connection = new OleDbConnection(CONNECTION STRING HERE);
    OleDbCommand command = new OleDbCommand();
    connection.Open();
    command.Parameters.Add("@name", OleDbType.VarWChar).Value = textBox[i].Text;
    command.Parameters.Add("@rating", OleDbType.Integer).Value = Convert.ToInt32(ratingBox[i].Text);
    command.CommandText = "INSERT INTO TotalPlayerName ([PlayerName], [Team], [Rating],  [Substitute], [Complete], [SportID]) VALUES (@name, null , @rating,  false, false, " + ID + ")";
    command.CommandType = CommandType.Text;
    command.Connection = connection;
    command.ExecuteNonQuery();
    connection.Close();
}

            //list of all ratings:
            List<int> ratingList = new List<int>();
            for (int i = 0; i < numberOfPlayers; i++)
            {
                ratingList.Add(Convert.ToInt32(ratingBox[i].Text));
            }
            ratingList.Sort();
            var count = ratingList.Count();
            // if even number of players, keep aside the one in the middle (as rating)
            int? middle = null;
            if (count % 2 != 0)
            {
                middle = ratingList[count / 2];
                ratingList.RemoveAt(count / 2);
            }
            var ratingListDesc = ratingList.OrderByDescending(i => i).ToList();
            var half = count / 2;
            var take = half % 2 != 0 ? half - 1 : half;
            var team1List = ratingList.Take(take).Where((r, i) => i % 2 == 0).ToList();
            team1List.AddRange(ratingListDesc.Take(take).Where((r, i) => i % 2 == 0));
            var team2List = ratingList.Take(take).Where((r, i) => i % 2 != 0).ToList();
            team2List.AddRange(ratingListDesc.Take(take).Where((r, i) => i % 2 != 0));
            // we just have to redistribute the remaining pair between each team
            if (half % 2 != 0)
            {
                team1List.Add(ratingList[half - 1]);
                team2List.Add(ratingListDesc[half - 1]);
            }
            // this part will add the team numbers to the database
            for (int i = 0; i < (count/2); i++)
            {
                OleDbConnection connection = new OleDbConnection(CONNECTION STRING HERE);
                OleDbCommand command = new OleDbCommand();
                connection.Open();
                command.CommandText = "update TotalPlayerName set Team = 1, Complete = true WHERE Team = null AND Complete = false AND Rating = " + team1List[i];
                command.CommandType = CommandType.Text;
                command.Connection = connection;
                command.ExecuteScalar();
                command.CommandText = "update TotalPlayerName set Team = 2, Complete = true WHERE Team = null AND Complete = false AND Rating = " + team2List[i];
                command.ExecuteScalar();
                connection.Close();

            }

有没有办法避免这种情况并添加评级而不会重叠?

注意:这里的代码只是作为我正在做的事情的一个例子,你不必阅读它来了解我想要做什么,但它可能会也可能不会帮助你理解。

C# 数据库更新重叠

我相信

您的问题既在于存在重复的信息,而且该信息在每个列表中的同一位置。 如果您在 SQL 插入之间中断,并查询数据库以查看数据,我希望您会发现您的 where 子句在两个插入中对该特定播放器的评估结果为 true。

关于要进行哪些编辑来更改它,我建议将玩家列表划分为列表,一个用于团队 1,另一个用于团队 2,并仅在团队 1 列表上运行团队 1 的更新查询,团队 2 也是如此。

一些注意事项..在上面列出的代码中,你有很多机会出现整数除法错误,或者让一个团队的球员转移到另一个团队。 如果不重写代码片段的很大一部分,我就无法完全为您提供一段代码来解决您的问题。 我还建议完全构造数据库行条目并一次插入所有条目,而不是插入,然后返回并更新。 它增加了数据库上不必要的负载,并引入了另一层可能的错误。

我对代码的理解如下:

  1. 合并玩家评分
  2. 如果是奇数玩家,请删除中间评分
  3. 在团队之间划分玩家,例如评分最高的球队 1、排名第二的球队 2、排名第三的球队 1 等
  4. 将数据保存到数据库。

以下可能是一种方法,并避免了许多可能的错误来源。

List<int> ratingsList = new List<int>(); //Presume this is already populated.
List<int> team1 = new List<int>();
List<int> team2 = new List<int>();
ratingsList = ratingsList.Sort();
if(ratingsList.Count() % 2 != 0)
{
    ratingsList.Remove((ratingsList.Count()/2)+2));  //Integer divide intentional
}
for(int i = 0; i < ratingsList.Count() ; i++)
{
    if(i%2 != 0)
    {
        team1.Add(ratingsList[i]);
    }
    else
    {
        team2.Add(ratingsList[i]);
    }
}
foreach(var player in team1)
{
    //Add SQL Insert here
}
foreach(var player in team2)
{
    //Add SQL Insert here
}

上面列出的代码段是伪代码,所以不要指望它只是工作。 我看到的最大问题是玩家被划分和识别评级,这不是单个玩家独有的,所以你无法在代码中唯一地识别玩家。 超出问题范围的建议是构建一个玩家类来包含信息,并使评级列表、团队 1、团队 2 类型为 Player。 您仍然可以使用 OrderByDesc(linq(按评级排序,然后您不必担心跟踪分配给谁的值。