示例#1
0
        /// <summary>
        /// This function handles the "Upload PGN" button.
        /// Given a filename, parses the PGN file, and uploads
        /// each chess game to the user's database.
        /// </summary>
        /// <param name="PGNfilename">The path to the PGN file</param>
        private void UploadGamesToDatabase(string PGNfilename)
        {
            // This will build a connection string to your user's database on atr,
            // assuimg you've typed a user and password in the GUI
            string connection = GetConnectionString();

            // TODO: Load and parse the PGN file
            //       We recommend creating separate libraries to represent chess data and load the file
            ChessTools.PGNReader        reader = new ChessTools.PGNReader(PGNfilename);
            List <ChessTools.ChessGame> Games  = reader.getChessGames();

            // Use this to tell the GUI's progress bar how many total work steps there are
            // For example, one iteration of your main upload loop could be one work step
            SetNumWorkItems(Games.Count);



            using (MySqlConnection conn = new MySqlConnection(connection))
            {
                try
                {
                    // Open a connection

                    conn.Open();

                    //Prepare necessary commands for use

                    MySqlCommand commandForPlayers = conn.CreateCommand();
                    commandForPlayers.CommandText = "INSERT INTO Players (Name, Elo) values (@var1, @var2) ON DUPLICATE KEY UPDATE Elo = IF(@var2 > Elo, @var2, Elo); " +
                                                    "SELECT pID from Players WHERE Name = @var1";
                    commandForPlayers.Parameters.AddWithValue("@var1", "Invalid Name");
                    commandForPlayers.Parameters.AddWithValue("@var2", -1);
                    commandForPlayers.Prepare();

                    MySqlCommand commandForEvents = conn.CreateCommand();
                    commandForEvents.CommandText = "INSERT IGNORE INTO Events (Name, Site, Date) values (@var1, @var2, @var3); " +
                                                   "SELECT eID from Events WHERE Name = @var1 && Site = @var2 && Date = @var3";
                    commandForEvents.Parameters.AddWithValue("@var1", "Invalid Name");
                    commandForEvents.Parameters.AddWithValue("@var2", "Invalid Site");
                    commandForEvents.Parameters.AddWithValue("@var3", "Invalid Date");
                    commandForEvents.Prepare();

                    MySqlCommand commandForGames = conn.CreateCommand();
                    commandForGames.CommandText = "INSERT IGNORE INTO Games (Round, Result, Moves, BlackPlayer, WhitePlayer, eID) values (@var1, @var2, @var3, @var4, @var5, @var6)";
                    commandForGames.Parameters.AddWithValue("@var1", "0");
                    commandForGames.Parameters.AddWithValue("@var2", 'E');
                    commandForGames.Parameters.AddWithValue("@var3", "0");
                    commandForGames.Parameters.AddWithValue("@var4", 0);
                    commandForGames.Parameters.AddWithValue("@var5", 0);
                    commandForGames.Parameters.AddWithValue("@var6", 0);
                    commandForGames.Prepare();


                    // iterate through data and generate appropriate insert commands
                    foreach (ChessTools.ChessGame game in Games)
                    {
                        int wID;
                        int bID;
                        int eID;

                        commandForPlayers.Parameters["@var1"].Value = game.White;
                        commandForPlayers.Parameters["@var2"].Value = game.WhiteElo;
                        wID = Convert.ToInt32(commandForPlayers.ExecuteScalar());
                        commandForPlayers.Parameters["@var1"].Value = game.Black;
                        commandForPlayers.Parameters["@var2"].Value = game.BlackElo;
                        bID = Convert.ToInt32(commandForPlayers.ExecuteScalar());

                        commandForEvents.Parameters["@var1"].Value = game.Event;
                        commandForEvents.Parameters["@var2"].Value = game.Site;
                        commandForEvents.Parameters["@var3"].Value = game.EventDate;
                        eID = Convert.ToInt32(commandForEvents.ExecuteScalar());

                        commandForGames.Parameters["@var1"].Value = game.Round;
                        commandForGames.Parameters["@var2"].Value = game.Result;
                        commandForGames.Parameters["@var3"].Value = game.Moves;
                        commandForGames.Parameters["@var4"].Value = bID;
                        commandForGames.Parameters["@var5"].Value = wID;
                        commandForGames.Parameters["@var6"].Value = eID;
                        commandForGames.ExecuteNonQuery();

                        // Use this to tell the GUI that one work step has completed:
                        WorkStepCompleted();
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
        /// <summary>
        /// This function handles the "Upload PGN" button.
        /// Given a filename, parses the PGN file, and uploads
        /// each chess game to the user's database.
        /// </summary>
        /// <param name="PGNfilename">The path to the PGN file</param>
        private void UploadGamesToDatabase(string PGNfilename)
        {
            // This will build a connection string to your user's database on atr,
            // assuimg you've typed a user and password in the GUI
            string connection = GetConnectionString();

            // TODO: Load and parse the PGN file
            // We recommend creating separate libraries to represent chess data and load the file

            List <ChessGame> games = new ChessTools.PGNReader().ReadFromFile(PGNfilename);

            // Use this to tell the GUI's progress bar how many total work steps there are
            // For example, one iteration of your main upload loop could be one work step
            SetNumWorkItems(games.Count);

            using (MySqlConnection conn = new MySqlConnection(connection))
            {
                try
                {
                    // Open a connection
                    conn.Open();

                    // TODO: iterate through your data and generate appropriate insert commands
                    foreach (var g in games)
                    {
                        MySqlCommand command = conn.CreateCommand();

                        // Insert Events values
                        command.CommandText = "insert ignore into Events(Name, Site, Date) "
                                              + "values (@Name, @Site, @Date)";
                        command.Parameters.AddWithValue("@Name", g.Event);
                        command.Parameters.AddWithValue("@Site", g.Site);
                        command.Parameters.AddWithValue("@Date", g.EventDate);
                        command.ExecuteNonQuery();

                        // Insert White Players
                        command             = conn.CreateCommand();
                        command.CommandText = "insert into Players(Name, Elo)"
                                              + "select * from (select @wName, @wElo) as temp where not exists (select Name from Players where Name = @wName)";
                        command.Parameters.AddWithValue("@wName", g.White);
                        command.Parameters.AddWithValue("@wElo", g.WhiteElo);
                        command.ExecuteNonQuery();

                        command             = conn.CreateCommand();
                        command.CommandText = "update Players set Elo = @wElo "
                                              + "where (Name = @wName and Elo < @wElo)";
                        command.Parameters.AddWithValue("@wName", g.White);
                        command.Parameters.AddWithValue("@wElo", g.WhiteElo);
                        command.ExecuteNonQuery();

                        // Insert Black Players
                        command.CommandText = "insert into Players(Name, Elo)"
                                              + "select * from (select @bName, @bElo) as temp where not exists (select Name from Players where Name = @bName)";
                        command.Parameters.AddWithValue("@bName", g.Black);
                        command.Parameters.AddWithValue("@bElo", g.BlackElo);
                        command.ExecuteNonQuery();

                        command             = conn.CreateCommand();
                        command.CommandText = "update Players set Elo = @bElo "
                                              + "where (Name = @bName and Elo < @bElo)";
                        command.Parameters.AddWithValue("@bName", g.Black);
                        command.Parameters.AddWithValue("@bElo", g.BlackElo);
                        command.ExecuteNonQuery();

                        // Insert Games values
                        command             = conn.CreateCommand();
                        command.CommandText = "insert ignore into Games(Result, Moves, BlackPlayer, WhitePlayer, eID) "
                                              + "values (@Result, @Moves, (select pID from Players where Name = @BlackPlayer), (select pID from Players where Name = @WhitePlayer),"
                                              + "(select eID from Events where Name = @Name and Date = @Date))";
                        command.Parameters.AddWithValue("@Result", g.Result);
                        command.Parameters.AddWithValue("@Moves", g.Moves);
                        command.Parameters.AddWithValue("@BlackPlayer", g.Black);
                        command.Parameters.AddWithValue("@WhitePlayer", g.White);
                        command.Parameters.AddWithValue("@Name", g.Event);
                        command.Parameters.AddWithValue("@Date", g.EventDate);
                        command.ExecuteNonQuery();

                        // Use this to tell the GUI that one work step has completed:
                        WorkStepCompleted();
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
示例#3
0
        /// <summary>
        /// This function handles the "Upload PGN" button.
        /// Given a filename, parses the PGN file, and uploads
        /// each chess game to the user's database.
        /// </summary>
        /// <param name="PGNfilename">The path to the PGN file</param>
        private void UploadGamesToDatabase(string PGNfilename)
        {
            // This will build a connection string to your user's database on atr,
            // assuimg you've typed a user and password in the GUI
            string connection = GetConnectionString();

            // TODO: Load and parse the PGN file
            //       We recommend creating separate libraries to represent chess data and load the file

            // Use this to tell the GUI's progress bar how many total work steps there are
            // For example, one iteration of your main upload loop could be one work step
            // SetNumWorkItems(...);

            /*Instatiate PGN Reader and read the pgn file*/
            PGNReader        pgn   = new ChessTools.PGNReader();
            List <ChessGame> games = pgn.Reader(PGNfilename);

            Dictionary <string, int> Players = pgn.createPlayers(games);


            using (MySqlConnection conn = new MySqlConnection(connection))
            {
                try
                {
                    // Open a connection
                    conn.Open();


                    /*Add Players to database, need to add ELO in if it is higher*/
                    foreach (KeyValuePair <string, int> entry in Players)
                    {
                        MySqlCommand command = conn.CreateCommand();

                        command.CommandText = "INSERT INTO Players (Name, Elo) SELECT * FROM " +
                                              "(SELECT @Name, @Elo) as temp WHERE NOT EXISTS (" +
                                              "SELECT Name FROM Players WHERE Name = @Name) LIMIT 1";

                        command.Parameters.Add(new MySqlParameter("@Name", entry.Key));
                        command.Parameters.Add(new MySqlParameter("@Elo", entry.Value));

                        command.ExecuteNonQuery();
                    }

                    /*Add Events and Games to Database*/
                    foreach (ChessGame game in games)
                    {
                        WorkStepCompleted();

                        /*Update White Elos if we find a better elo*/
                        MySqlCommand command = conn.CreateCommand();

                        command.CommandText = "Update Players set Elo = @Elo where (Name = @Name and Elo < @Elo)";

                        command.Parameters.Add(new MySqlParameter("@Name", game.getWhite()));
                        command.Parameters.Add(new MySqlParameter("@Elo", game.getWhiteElo()));

                        command.ExecuteNonQuery();

                        /*Update Black Elos if we find a better elo*/

                        MySqlCommand command1 = conn.CreateCommand();

                        command1.CommandText = "Update Players set Elo = @Elo where (Name = @Name and Elo < @Elo)";

                        command1.Parameters.Add(new MySqlParameter("@Name", game.getBlack()));
                        command1.Parameters.Add(new MySqlParameter("@Elo", game.getBlackElo()));

                        command1.ExecuteNonQuery();

                        /*Events Query*/
                        MySqlCommand command2 = conn.CreateCommand();

                        command2.CommandText = "Insert ignore into Events(Name,Site,Date) values(@Name,@Site,@Date)";

                        command2.Parameters.Add(new MySqlParameter("@Name", game.getEventName()));
                        command2.Parameters.Add(new MySqlParameter("@Site", game.getSite()));
                        command2.Parameters.Add(new MySqlParameter("@Date", game.getEventDate()));

                        command2.ExecuteNonQuery();


                        /*Games Query*/
                        MySqlCommand command3 = conn.CreateCommand();

                        command3.CommandText = "Insert into Games(Result,Moves,BlackPlayer,WhitePlayer,eID) values(@Result,@Moves," +
                                               "(select pID from Players where Name = @BlackPlayer)," +                   //Gets pID for BlackPlayer based on name
                                               "(select pID from Players where Name = @WhitePlayer)," +                   //Gets pID for WhitePlayer based on name
                                               "(select eID from Events where Name = @EventName and Date = @EventDate)" + //Gets eID from Events based on event name
                                               ")";

                        command3.Parameters.Add(new MySqlParameter("@Result", game.getResult()));
                        command3.Parameters.Add(new MySqlParameter("@Moves", game.getMoves()));
                        command3.Parameters.Add(new MySqlParameter("@BlackPlayer", game.getBlack()));
                        command3.Parameters.Add(new MySqlParameter("@WhitePlayer", game.getWhite()));
                        command3.Parameters.Add(new MySqlParameter("@EventName", game.getEventName()));
                        command3.Parameters.Add(new MySqlParameter("@EventDate", game.getEventDate()));

                        command3.ExecuteNonQuery();
                    }

                    // Use this to tell the GUI that one work step has completed:
                    // WorkStepCompleted();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }