Разработка базы данных с использованием графических примитивов на тему «Игры»
Заказать уникальную курсовую работу- 50 50 страниц
- 9 + 9 источников
- Добавлена 14.06.2024
- Содержание
- Часть работы
- Список литературы
Постановка задачи 5
1. Проектирование программного продукта 7
1.1 Жизненный цикл программного обеспечения 7
1.2 Выбор модели жизненного цикла 11
1.3 Выбор средств разработки 12
2. Проектирование базы данных 14
2.1 Анализ предметной области и разработка логической модели 14
2.2 Разработка физической модели базы данных 16
3. Разработка программного кода 18
3.1 Разработка пользовательского интерфейса 18
3.2 Написание программного кода 20
3.3 Тестирование и отладка 27
3.4 Создание конечного продукта 28
4. Программная документация 30
4.1 Руководство пользователя (инструкция по работе) 30
Заключение 38
Список использованных сокращений 39
Список используемых источников 40
Приложение A 41
Enabled = false;загрузитьДанныеToolStripMenuItem.Enabled = false;сохранитьДанныеToolStripMenuItem.Enabled = false;this.FormBorderStyle = FormBorderStyle.FixedSingle;this.MaximizeBox = false;this.MinimizeBox = false; }private void выходToolStripMenuItem_Click(object sender, EventArgs e) {this.Close(); }private void выходToolStripMenuItem1_Click(object sender, EventArgs e) {this.Close(); }private void BdCreate(string nameBD){ // создаем новую базу данных и таблицу в нейSQLiteConnection.CreateFile(nameBD);using (Conn = new SQLiteConnection($"Data Source={nameBD}")) {stringcommandText = "CREATE TABLE IF NOT EXISTS Games ";commandText += "(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ";commandText += "NameGame TEXT NOT NULL, ";commandText += "Genre TEXT NOT NULL, ";commandText += "DeveloperGame TEXT NOT NULL, ";commandText += "MinAge INTEGER NOT NULL, ";commandText += "YearRelease INTEGER NOT NULL)";commandSQL = new SQLiteCommand(commandText, Conn);Conn.Open();commandSQL.ExecuteNonQuery();commandSQL.Dispose(); } }privateintInsertRecord(string cmdTxt, string nameBD){ //всавка записи, входные параметры: командная строка, имя базы данныхint number;using (Conn = new SQLiteConnection($"Data Source={nameBD}")) {Conn.Open();commandSQL = new SQLiteCommand(cmdTxt, Conn);number = commandSQL.ExecuteNonQuery(); }return number; }publicDataTableGetDataFromTable(string tableName, string nameBD) {dt = new DataTable();using (Conn = new SQLiteConnection($"Data Source={nameBD}")) {Conn.Open();string query = $"SELECT * FROM {tableName};";using (commandSQL = new SQLiteCommand(query, Conn)) {using (var adapter = new SQLiteDataAdapter(commandSQL)) {adapter.Fill(dt); } } }returndt; }private void RefreshTable(string tableName) {if (GamesdataGridView.Tag != null) {DataTabledt = GetDataFromTable(nameTable, dbFileName);GamesdataGridView.DataSource = dt; } }public void DeleteRecord(int id, string tableName, string nameBD) {using (Conn = new SQLiteConnection($"Data Source={nameBD}")) {Conn.Open();commandSQL = new SQLiteCommand(Conn);commandSQL.CommandText = $"DELETE FROM {tableName} WHERE Id = @Id";commandSQL.Parameters.AddWithValue("@Id", id);commandSQL.ExecuteNonQuery(); } }private void mainForm_Load(object sender, EventArgs e) {if (File.Exists(dbFileName) == false) {DialogResultdialogResult = MessageBox.Show("Базаданныхотсутствует, создатьбазуданных?", "БазаданныхИгры", MessageBoxButtons.YesNo);if (dialogResult == DialogResult.Yes) { // создаем новую базу данных и таблицу в нейBdCreate(dbFileName);MessageBox.Show("Новая база данных успешно создана и подключена");обновитьToolStripMenuItem.Enabled = true;загрузитьДанныеToolStripMenuItem.Enabled = true;сохранитьДанныеToolStripMenuItem.Enabled = true; }else if (dialogResult == DialogResult.No){ // если база отсутствует и был отказ от созданияMessageBox.Show("База данных отсутствует, необходимо создать базу данных!"); } }else { // если база имеется, сообщаем о успешном подключенииusing (Conn = new SQLiteConnection($"Data Source={dbFileName}")) {Conn.Open();MessageBox.Show("Базаданныхуспешноподключена"); }обновитьToolStripMenuItem.Enabled = true;загрузитьДанныеToolStripMenuItem.Enabled = true;сохранитьДанныеToolStripMenuItem.Enabled = true; } }private void показатьДанныеToolStripMenuItem_Click(object sender, EventArgs e) { flowLayoutPanel1.Visible = true;DataTabledt = GetDataFromTable(nameTable, dbFileName);GamesdataGridView.DataSource = dt;GamesdataGridView.Visible = true;GamesdataGridView.Tag = nameTable;if (dt.Rows.Count == 0) {MessageBox.Show("Таблица пуста!Загрузите данные из файла или введите данные вручную."); }else {RefreshTable(nameTable); } // Очистить и заполнить выпадающий список сортировкиsortComboBox.Items.Clear();if (GamesdataGridView.Columns.Count > 0) {foreach (DataGridViewColumn column in GamesdataGridView.Columns) {sortComboBox.Items.Add(column.HeaderText); } } }private void OpenData() { // заполнениетаблицыданнымиint k = 0;intnumber; // открываем файл с данными и заполняем таблицу // настраиваем фильтр при открытии файла openFileDialog1.Filter = "Textfiles(*.txt)|*.txt|Allfiles(*.*)|*.*"; // вызываем метод открытия диалогового окнаif (openFileDialog1.ShowDialog() == DialogResult.Cancel)return; // в fileNameData будем хранить имя файла из которого будем считывать данныеString fileNameData = openFileDialog1.FileName;try {using (StreamReadersr = new StreamReader(fileNameData)) {string line; // Iterating the filewhile (!sr.EndOfStream) {stringcommandText = "INSERT INTO Games (NameGame, Genre, DeveloperGame, MinAge, YearRelease) VALUES (";line = sr.ReadLine();commandText += "'" + line + "', ";line = sr.ReadLine();commandText += "'" + line + "', ";line = sr.ReadLine();commandText += "'" + line + "', ";line = sr.ReadLine();commandText += line + ", ";line = sr.ReadLine();commandText += line + ");";number = InsertRecord(commandText, dbFileName); k = k + number; } } } // вслучаеошибкиcatch (Exception ex) {MessageBox.Show("В процессе загрузки данных произошла ошибка: {0}", ex.ToString()); }MessageBox.Show($"В таблицу Games добавлено объектов: {k}");}private void создатьБДToolStripMenuItem_Click(object sender, EventArgs e) {if (File.Exists(dbFileName) == true) {DialogResultdialogResult = MessageBox.Show("Имеетсябазаданных, хотитесоздатьновуюбазуданных?", "Подключениекбазеданных", MessageBoxButtons.YesNo);if (dialogResult == DialogResult.Yes) { // закрываем соединение с базой данных if (Conn != null)Conn.Close();// удаляем базу данных File.Delete(dbFileName); // создаем новую базу данных и таблицу в нейBdCreate("ComputerStoreBD.db");MessageBox.Show("Новая база данных создана");обновитьToolStripMenuItem.Enabled = true;загрузитьДанныеToolStripMenuItem.Enabled = true;сохранитьДанныеToolStripMenuItem.Enabled = true;DialogResult dialogResult1 = MessageBox.Show("Вбазеотсутствуютданные, добавитьданныеизфайла?", "Созданиебазыданных", MessageBoxButtons.YesNo);if (dialogResult1 == DialogResult.Yes) {OpenData(); }else { // если база пуста и был отказ от добавленияMessageBox.Show("Для добавления данных загрузите данные из файла или введите данные вручную после того, как откроете таблицу"); } }else {MessageBox.Show("Без базы данных работа невозможна!"); } }else { // создаем новую базу данных и таблицу в нейBdCreate("ComputerStoreBD.db");MessageBox.Show("Новая база данных создана");обновитьToolStripMenuItem.Enabled = true;загрузитьДанныеToolStripMenuItem.Enabled = true;сохранитьДанныеToolStripMenuItem.Enabled = true;DialogResult dialogResult1 = MessageBox.Show("Вбазеотсутствуютданные, добавитьданныеизфайла?", "Созданиебазыданных", MessageBoxButtons.YesNo);if (dialogResult1 == DialogResult.Yes) {OpenData(); }else { // если база пуста и был отказ от добавленияMessageBox.Show("Для добавления данных загрузите данные из файла или введите данные вручную после того, как откроете таблицу");} } }private void загрузитьДанныеToolStripMenuItem_Click(object sender, EventArgs e) {OpenData(); }private void sortComboBox_SelectedIndexChanged(object sender, EventArgs e) {if (sortComboBox.SelectedItem != null && GamesdataGridView.DataSource != null) {stringsortField = sortComboBox.SelectedItem.ToString(); (GamesdataGridView.DataSource as DataTable).DefaultView.Sort = sortField; } }private void buttonAdd_Click(object sender, EventArgs e) {if (nameTextBox.Text.Length != 0 && genreTextBox.Text.Length != 0 && developerTextBox.Text.Length != 0 && minAgeTextBox.Text.Length != 0 && yearReleaseTextBox.Text.Length != 0) {int number;stringcommandText = $"INSERT INTO {nameTable} (NameGame, Genre, DeveloperGame, MinAge, YearRelease) VALUES (";commandText += "'" + nameTextBox.Text + "', ";commandText += "'" + genreTextBox.Text + "', ";commandText += "'" + developerTextBox.Text + "', ";commandText += minAgeTextBox.Text + ", ";commandText += yearReleaseTextBox.Text + ");";number = InsertRecord(commandText, dbFileName);MessageBox.Show($"Втаблицу Users добавленообъектов: {number}");RefreshTable(nameTable);nameTextBox.Text = "";genreTextBox.Text = "";developerTextBox.Text = "";minAgeTextBox.Text = "";yearReleaseTextBox.Text = ""; } }private void buttonDelete_Click(object sender, EventArgs e){if (GamesdataGridView.CurrentRow == null) return; // Проверяем, выбрана ли строка, если нет - ничего не делаемintrowIndex = GamesdataGridView.CurrentRow.Index;if (GamesdataGridView.Rows[rowIndex].Cells[0].Value == null) return; // Проверяем, естьлизначениевячейкес ID, еслинет - ничегонеделаем//запоминаем в Id значение id записиboolisParsed = int.TryParse(GamesdataGridView.Rows[rowIndex].Cells[0].Value.ToString(), out Id);if (!isParsed) return; // Если не удалось преобразовать ID в число, прекращаем выполнениеvarconfirmationResult = MessageBox.Show("Вы уверены, что хотите удалить эту запись?", "Удаление записи", MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (confirmationResult == DialogResult.Yes) {vartableName = GamesdataGridView.Tag.ToString();DeleteRecord(Id, tableName,dbFileName);RefreshTable(nameTable); } }private void buttonEdit_Click(object sender, EventArgs e) {if (GamesdataGridView.CurrentRow == null) return; // Проверяем, выбраналистрокаintrowIndex = GamesdataGridView.CurrentRow.Index;if (GamesdataGridView.Rows[rowIndex].Cells[0].Value == null) return; // Проверяем, естьлизначениевячейкес IDboolisParsed = int.TryParse(GamesdataGridView.Rows[rowIndex].Cells[0].Value.ToString(), out Id);if (!isParsed) return; // Если не удалось преобразовать ID в число, прекращаем выполнениеnameTextBox.Text = GamesdataGridView.Rows[rowIndex].Cells[1].Value.ToString();genreTextBox.Text = GamesdataGridView.Rows[rowIndex].Cells[2].Value.ToString();developerTextBox.Text = GamesdataGridView.Rows[rowIndex].Cells[3].Value.ToString();minAgeTextBox.Text = GamesdataGridView.Rows[rowIndex].Cells[4].Value.ToString();yearReleaseTextBox.Text = GamesdataGridView.Rows[rowIndex].Cells[5].Value.ToString(); }private void buttonSave_Click(object sender, EventArgs e) {if (nameTextBox.Text.Length != 0 && genreTextBox.Text.Length != 0 && developerTextBox.Text.Length != 0 && minAgeTextBox.Text.Length != 0 && yearReleaseTextBox.Text.Length != 0) {int number;stringcommandText; //задаемкоманднуюстрокуcommandText = $"UPDATE {nameTable} SET ";commandText += "NameGame='" + nameTextBox.Text + "', ";commandText += "Genre='" + genreTextBox.Text + "', ";commandText += "DeveloperGame='" + developerTextBox.Text + "', ";commandText += "MinAge=" + minAgeTextBox.Text + ", ";commandText += "YearRelease=" + yearReleaseTextBox.Text + " WHERE id=" + Id.ToString();using (Conn = new SQLiteConnection($"Data Source={dbFileName}")) {Conn.Open(); commandSQL = new SQLiteCommand(commandText, Conn);number = commandSQL.ExecuteNonQuery();MessageBox.Show($"Обновленообъектов: {number}"); }RefreshTable(nameTable);nameTextBox.Text = "";genreTextBox.Text = "";developerTextBox.Text = "";minAgeTextBox.Text = "";yearReleaseTextBox.Text = ""; } }private void SearchInDataTable(string searchQuery1, string searchQuery2 = null) {if (GamesdataGridView.DataSource is DataTabledtOriginal){ // Создаем копию DataTable для фильтрации, чтобы не изменять исходные данныеDataTabledtFiltered = dtOriginal.Clone(); // Преобразуем DataTable в Enumerable для использования LINQvarrows = dtOriginal.AsEnumerable(); // Фильтрация строк по первому поисковому запросуvarfilteredRows = rows.Where(row => row.ItemArray.Any(field => field.ToString().Contains(searchQuery1)));// Если задан второй поисковый запрос, дополнительно фильтруем строкиif (!string.IsNullOrEmpty(searchQuery2)) {filteredRows = filteredRows.Where(row => row.ItemArray.Any(field => field.ToString().Contains(searchQuery2)));} // Добавляем отфильтрованные строки в новуюDataTableforeach (var row in filteredRows) {dtFiltered.ImportRow(row); } // УстанавливаемотфильтрованнуюDataTableвкачествеисточникаданныхдляDataGridViewGamesdataGridView.DataSource = dtFiltered; } }private void buttonSearch_Click(object sender, EventArgs e) {string searchQuery1 = textBoxSearchGenre.Text;string searchQuery2 = textBoxSearchName.Text;RefreshTable(nameTable); // Вызываем метод поиска // Если второе текстовое поле пустое, поиск выполнен только по 1 признакуSearchInDataTable(searchQuery1, string.IsNullOrEmpty(searchQuery2) ? null : searchQuery2); }private void buttonClear_Click(object sender, EventArgs e) {GamesdataGridView.DataSource = dt;RefreshTable(nameTable);textBoxSearchGenre.Text="";textBoxSearchName.Text=""; }private void сохранитьДанныеToolStripMenuItem_Click(object sender, EventArgs e) {if (dt.Rows.Count == 0) {MessageBox.Show("Таблицапуста!"); }else {RefreshTable(nameTable);try { // полнаяперезаписьфайлаusing (StreamWriter writer = new StreamWriter("outputData.txt", false, Encoding.Default)) {for (int j = 0; j < GamesdataGridView.Rows.Count; j++) {for (inti = 1; i < GamesdataGridView.Rows[j].Cells.Count; i++) {writer.WriteLine(GamesdataGridView.Rows[j].Cells[i].Value);} } }MessageBox.Show("Данные успешно сохранены в файл!"); }catch (Exceptionex) {MessageBox.Show("В процессе сохранения данных произошла ошибка: {0}", ex.ToString());} } }private void nameTextBox_KeyPress(object sender, KeyPressEventArgs e) { //запретввода/ , \, " и 'if (e.KeyChar == Convert.ToChar(47) || e.KeyChar == Convert.ToChar(92) || e.KeyChar == Convert.ToChar(34) || e.KeyChar == Convert.ToChar(39)) {e.Handled = true; } }private void genreTextBox_KeyPress(object sender, KeyPressEventArgs e) { //запретввода/ , \, " и 'if (e.KeyChar == Convert.ToChar(47) || e.KeyChar == Convert.ToChar(92) || e.KeyChar == Convert.ToChar(34) || e.KeyChar == Convert.ToChar(39)) {e.Handled = true; } }private void developerTextBox_KeyPress(object sender, KeyPressEventArgs e) { //запретввода/ , \, " и 'if (e.KeyChar == Convert.ToChar(47) || e.KeyChar == Convert.ToChar(92) || e.KeyChar == Convert.ToChar(34) || e.KeyChar == Convert.ToChar(39)) {e.Handled = true; } }private void minAgeTextBox_KeyPress(object sender, KeyPressEventArgs e) { //вводтолькоцифри backspaceif (!Char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(8)) {e.Handled = true; } }private void yearReleaseTextBox_KeyPress(object sender, KeyPressEventArgs e) { //вводтолькоцифри backspaceif (!Char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(8)) {e.Handled = true; } }private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e){MessageBox.Show("Приложение для работы с базой данных Игры: позволяет создать базу данных, просматривать, добавлять, редактировать и сохранять данные."); } }}
2. Ишкова Э.А. Самоучитель C#. Начала программирования. 2-е издание. – СПб.: Наука и Техника, 2013. – 496 с.
3. Модели и методологии разработки ПО. [Сайт GeekBrains] – URL: https://gb.ru/blog/modeli-i-metodologii-razrabotki-po/ (дата обращения 10.05.2024). – Режим доступа: свободный
4. Начало работы с SQLite в Visual Studio на C#: создание бд, таблиц, вставка записей и отображение. [Электронный ресурс] – URL: https://upread.ru/art.php?id=393. (Дата обращения: 12.05.2024) – Режим доступа: свободный.
5. Обзор и установка Visual Studio 2019 Community на Windows 10. [Электронный ресурс] –URL: https://info-comp.ru/programmirovanie/739-install-visual-studio-2019-community.html. (Дата обращения: 12.05.2024) – Режим доступа: свободный.
6. Павловская Т.А. С#. Программирование на языке высокого уровня: Учебник для вузов. – СПб.: Питер, 2014. – 432 с.
7. Проектирование программного обеспечения. [Электронный ресурс] – https://habr.com/ru/companies/edison/articles/267569/. (Дата обращения: 13.05.2024) – Режим доступа: свободный.
8. Руководство по классическим приложениям (Windows Forms .NET). [Электронный ресурс] – URL: https://learn.microsoft.com/ru-ru/dotnet/desktop/winforms/overview/?view=netdesktop-8.0. (Дата обращения: 12.05.2024) – Режим доступа: свободный.
9. Спиральная модель и архитектура разработки программного обеспечения. [Электронный ресурс] – URL: https://janberg.by/spiral-model-spiralnaya-model-i-arxitektura-razrabotki-programmnogo-obespecheniya/. (Дата обращения: 13.05.2024) – Режим доступа: свободный.