我无法更新MySQL数据库中的列onlinestatus
。我做了一张照片,展示了我想要实现的目标以及数据库的样子(请原谅我的油漆技巧嘿嘿)。
以下是我正在使用的代码:
string connString = "Server=localhost;Port=3306;Database=rookstat;Uid=XXXXXX;password=XXXXX;";
using (var connection = new MySqlConnection(connString))
{
connection.Open();
using (var command = new MySqlCommand())
{
command.Connection = connection;
command.CommandText = @"
UPDATE rookstayers SET level = 0 WHERE name = @name;
UPDATE rookstayers SET onlinestatus = 0;
DELETE FROM rookstayers WHERE name = @name;
INSERT INTO rookstayers (name, sex, vocation, level, achievements, world, lastlogin, accountstatus, onlinestatus) VALUES (@name, @sex, @vocation, @level, @achievements, @world, @lastLogin, @accountstatus, @onlinestatus);
";
command.Prepare();
foreach (var rooker in Players)
{
command.Parameters.Clear();
command.Parameters.AddWithValue("@name", rooker.Name);
command.Parameters.AddWithValue("@sex", rooker.Sex);
command.Parameters.AddWithValue("@vocation", rooker.Vocation);
command.Parameters.AddWithValue("@level", rooker.Level);
command.Parameters.AddWithValue("@achievements", rooker.Achievements);
command.Parameters.AddWithValue("@world", rooker.World);
command.Parameters.AddWithValue("@lastLogin", rooker.LastLogin);
command.Parameters.AddWithValue("@accountstatus", rooker.AccountStatus);
command.Parameters.AddWithValue("@onlinestatus", rooker.OnlineStatus);
command.ExecuteNonQuery();
}
Players.Clear();
}
connection.Close();
}
所以我基本上希望它清除级别和onlinestatus,删除现有行,插入播放器。
注意:我的应用程序中名称始终是唯一的。
注意2:如果我删除了UPDATE rookstayers SET onlinestatus = 0;
行,它将添加所有玩家并按照应有的状态向他们提供在线状态1。但是这个应用程序是游戏的cronjob,每30分钟刷新一次。如果玩家在游戏中注销,这会导致问题。他们的在线价值保持在1.这就是为什么我想在插入之前将数据库中的所有玩家设置为onlinestatus 0(离线)。然后插入它们。因为我插入的所有玩家都来自在线列表,这意味着他们在线。
答案 0 :(得分:0)
喔。我想我知道发生了什么。您的C#代码正在您的玩家"集合"中迭代每个Rooker。每次执行此操作,您都会运行4个查询。这4个查询中的一个是更新表中的每条记录,以便onlinestatus为零,包括您到目前为止已插入的所有记录。因此,只有插入的最后一条记录的在线状态为1.所有其他记录都将更新为0.(重复。这是非常低效的。)