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();
}
有没有办法避免这种情况并添加评级而不会重叠?
注意:这里的代码只是作为我正在做的事情的一个例子,你不必阅读它来了解我想要做什么,但它可能会也可能不会帮助你理解。
您的问题既在于存在重复的信息,而且该信息在每个列表中的同一位置。 如果您在 SQL 插入之间中断,并查询数据库以查看数据,我希望您会发现您的 where 子句在两个插入中对该特定播放器的评估结果为 true。
关于要进行哪些编辑来更改它,我建议将玩家列表划分为列表,一个用于团队 1,另一个用于团队 2,并仅在团队 1 列表上运行团队 1 的更新查询,团队 2 也是如此。
一些注意事项..在上面列出的代码中,你有很多机会出现整数除法错误,或者让一个团队的球员转移到另一个团队。 如果不重写代码片段的很大一部分,我就无法完全为您提供一段代码来解决您的问题。 我还建议完全构造数据库行条目并一次插入所有条目,而不是插入,然后返回并更新。 它增加了数据库上不必要的负载,并引入了另一层可能的错误。
我对代码的理解如下:
- 合并玩家评分
- 如果是奇数玩家,请删除中间评分
- 在团队之间划分玩家,例如评分最高的球队 1、排名第二的球队 2、排名第三的球队 1 等
- 将数据保存到数据库。
以下可能是一种方法,并避免了许多可能的错误来源。
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(按评级排序,然后您不必担心跟踪分配给谁的值。