C# - 无法更新mysql数据库列值

时间:2015-05-12 16:32:04

标签: c# mysql sql database winforms

我无法更新MySQL数据库中的列onlinestatus。我做了一张照片,展示了我想要实现的目标以及数据库的样子(请原谅我的油漆技巧嘿嘿)。

enter image description here

以下是我正在使用的代码:

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(离线)。然后插入它们。因为我插入的所有玩家都来自在线列表,这意味着他们在线。

1 个答案:

答案 0 :(得分:0)

喔。我想我知道发生了什么。您的C#代码正在您的玩家"集合"中迭代每个Rooker。每次执行此操作,您都会运行4个查询。这4个查询中的一个是更新表中的每条记录,以便onlinestatus为零,包括您到目前为止已插入的所有记录。因此,只有插入的最后一条记录的在线状态为1.所有其他记录都将更新为0.(重复。这是非常低效的。)