Разработка приложения для работы с базой данных методами присоединенных объектов ADO . NET — КиберПедия 

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Разработка приложения для работы с базой данных методами присоединенных объектов ADO . NET

2019-11-19 191
Разработка приложения для работы с базой данных методами присоединенных объектов ADO . NET 0.00 из 5.00 0 оценок
Заказать работу

Для этого необходимо запустить среду Visual Studio.NET, открыть созданный в предыдущей лабораторной работе проект. Понадобится использовать все созданные таблицы базы данных.

Таблица 5.5 - Пример транзакции при редактировании ведомостей

// Создать соединение с базой данных using (SqlConnection cs = new SqlConnection(Properties.Settings.Default.EDUConnectionString)) {     // Открыть соединение с базой данных         cs.Open();                       // Начать транзакцию         SqlTransaction t = cs.BeginTransaction();         // Создать команду к базе         SqlCommand cmd = cs.CreateCommand();         cmd.Transaction = t;                     // Составить команду удаления оценки по студенту и предмете         cmd.CommandText = @" delete from VED where PredId = @PredId and StudId = @StudId";         // Добавить параметр идентификации студента         cmd.Parameters.AddWithValue("@StudId", StudId);                             // Добавть параметр индентификатора периода         cmd.Parameters.AddWithValue("@PredId", int.Parse(cmbPred.SelectedValue.ToString()));         try         {   // Выполнить запрос                  cmd.ExecuteNonQuery();                  // Подтвердить транзакцию                  t.Commit();              }          catch(Exception ex)           { // Откатить транзакцию                  t.Rollback();                  throw ex;          } }

Поэтому требуется объединить все таблицы БД в один DataSet, аналогично операции добавления одной таблицы STUD.

После чего на главной форме у объекта BindingSource, требуется задать свойство DataMemeber = STUD.В главное меню приложения добавим три пункта: «Предметы», «Ведомость», «Выход» (рис. 5.1). Добавим на главную форму ещё один список (DataGridView) для отображения оценок студентов по предметам (рис. 5.2).

Рисунок 5.1 - Доработанное меню приложения

 

Рассмотрим события, возникающие на форме.

· По нажатию пункта «Предметы» реализуем открытие новой формы с редактором таблицы PRED, по аналогии с предыдущей лабораторной работой (рис. 5.3).

· По нажатию пункта «Ведомость» реализуем открытие новой формы (FormVed) с редактором ведомости одного студента. Идентификатор студента передаётся по выбранной строке списка студентов.

· По выбору строки в списке студентов будем изменять содержание списка с оценками, методом присоединённых объектов.

· По событию нажатия пункта «Выход» реализуем завершение работы приложения.

Рисунок 5.2 - Доработанная главная форма приложения

Рисунок 5.3 - Диалог редактирования списка предметов

Добавим через форму редактирования свойств и событий таблицы студентов следующие свойства (листинг 5.6):

1) событие изменения выделенной ячейки;

2) свойство отображения строк – полная строка;

3) запретить выделение нескольких строк.

Листинг 5.6 -. Дополнительные свойства DataGridView списка студентов

this.dataGridView1.CurrentCellChanged += new System.EventHandler(this.dataGridView1_CurrentCellChanged); // 1 this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; // 2 this.dataGridView1.MultiSelect = false;                                              // 3

 

Таблица ведомости должна обладать следующими свойствами (Листинг 5.7):

1) запрет добавления новых строк через интерфейс элемента управления;

2) запрет удаления строк через интерфейс элемента управления;

3) запретить выделение нескольких строк;

4) запретить редактирование записей через интерфейс элемента управления;

Листинг 5.7 - Дополнительные свойства DataGridView ведомости студента

this.dataGridVed.AllowUserToAddRows = false; // 1 this.dataGridVed.AllowUserToDeleteRows = false; // 2 this.dataGridVed.MultiSelect = false;        // 3 this.dataGridVed.ReadOnly = true;            // 4

    Структура изменённого проекта представлена на рис. 5.4. Код реализующий все события формы и вызов соответствующих диалоговых окон представлен в табл. 5.8.

 

Рисунок 5.4 - Структура проекта

Таблица 5.8 - Код главной формы приложения

using System; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace WindowsFormsApplication1 { /// <summary> /// Форма редактирования списка студентов и их ведомости /// </summary> public partial class FormStud: Form { /// <summary> /// Переменная для хранения идентификатора выбранного студента /// </summary> int studId = -1; /// <summary> /// Конструктор формы со спиком студентов /// </summary> public FormStud() { InitializeComponent(); }
Продолжение таблицы 5.8
/// <summary> /// Событие загрузки формы студентов /// </summary> /// <param name="sender">Форма</param> /// <param name="e">Аргумент</param> private void Form1_Load(object sender, EventArgs e) { // Связать данные базы и источник данных на форме this.sTUDTableAdapter.Fill(this.eDUDataSet.STUD); } /// <summary> /// Событие выбора пункта меню на сохранение данных /// </summary> /// <param name="sender">Меню</param> /// <param name="e">Аргумент</param> private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e) { // Обновить данные в базе this.sTUDTableAdapter.Update(this.eDUDataSet.STUD); } /// <summary> /// Событие выбора пункта меню на выход /// </summary> /// <param name="sender">Меню</param> /// <param name="e">Аргумент</param> private void выходToolStripMenuItem_Click(object sender, EventArgs e) { // Закрыть приложение Application.Exit(); } /// <summary> /// Событие выбора пункта меню на редактирование справочника предметов /// </summary> /// <param name="sender">Меню</param> /// <param name="e">Аргумент</param> private void предметыToolStripMenuItem_Click(object sender, EventArgs e) { // Создать форму редактирования предметов FormPred frmPred = new FormPred(); // Показать диалог для редактирования предметов frmPred.ShowDialog(); } /// <summary>
Продолжение таблицы 5.8
/// Событие смены курсора в списке студентов /// </summary> /// <param name="sender">Список студентов</param> /// <param name="e">Аргумент</param> private void dataGridView1_CurrentCellChanged(object sender, EventArgs e) { // Проверить выбран ли хотя бы один элемент из списка if (dataGridView1.SelectedCells.Count > 0) { // Получить индентификатор студента studId = int.Parse( dataGridView1.Rows[ dataGridView1.SelectedCells[0].RowIndex].Cells[0].Value.ToString() ); // Обновить ведомость после выбора студента LoadStudData(); } } /// <summary> /// Событие выбора пункта меню для редактирования вдеомости студента /// </summary> /// <param name="sender">Меню</param> /// <param name="e">Аргумент</param> private void ведомостьToolStripMenuItem_Click(object sender, EventArgs e) { // Проверить выбран ли студент if (studId > 0) { // Создать форму редактирования ведомости для студента FormVed frm = new FormVed(studId); // Показать форму frm.ShowDialog(); // Обновить ведомость после закрытия диалога редактирования ведомости LoadStudData(); } } /// <summary> /// Метод обновления ведомости по выбранному студенту /// </summary> public void LoadStudData()
Продолжение таблицы 5.8
{ // Проверить выбран ли студент if (studId > 0) { // Создать таблицу в ОП для хранения данных ведомости DataTable dtVed = new DataTable(); // Создать соединение с базой данных using(SqlConnection cs = new SqlConnection (Properties.Settings.Default.EDUConnectionString)) { // Открыть соединение с базой данных cs.Open(); // Создать команду к базе данных SqlCommand cmd = cs.CreateCommand(); // Создать запрос на выборку наименования предмета и оценки студента cmd.CommandText = "select p.Name, v.Value from VED v inner join PRED p on p.Id = v.PredId where v.StudId = @StudId"; // Создать параметер для индектификатора студента в запросе cmd.Parameters.Add(new SqlParameter("@StudId", SqlDbType.Int)); // Задать значение параметра идентификатора студента cmd.Parameters["@StudId"].Value = studId; // Создать адаптер для заполнения таблицы в ОП SqlDataAdapter ad = new SqlDataAdapter(cmd); // Заполнить таблицу значениями из базы ad.Fill(dtVed); } // Связать таблицу с элементов управления для отображения ведомости dataGridVed.DataSource = dtVed; } } } }

 

Диалог редактирования ведомости одного студента (FormVed) представлена на рис.5.5.

 

Рисунок 5.5 - Диалог редактирования ведомости студента

Форма диалога редактирования ведомости студента включает в себя следующие элементы управления, код формы приведён в табл. 5.9:

1) ComboBox для списка предметов, его свойства представлены на рис.5.6. Этот элемент управления необходимо связать с таблицей DataSet – PRED по аналогии с таблицей студентов;

 

Рисунок 5.6 - Свойства элемента управления для списка предметов

2) текстовое поле (TextBox) для ввода оценки студента по выбранному предмету;

3) кнопку для сохранения;

4) кнопку для закрытия диалога.

Таблица 5.9 - Листинг формы диалога редактирования ведомости

using System; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace WindowsFormsApplication1 { /// <summary> /// Форма ведомости /// </summary> public partial class FormVed: Form { /// <summary> /// Переменная для идентификатора студента /// </summary> int StudId = -1; /// <summary>
Продолжение таблицы 5.9
/// Конструктор формы ведомости студента /// </summary> /// <param name="studId">Идентификатор студента</param> public FormVed(int studId) { StudId = studId; InitializeComponent(); } /// <summary> /// Событие загрузки формы ведомости /// </summary> /// <param name="sender">Форма</param> /// <param name="e">Аргумент</param> private void FormVed_Load(object sender, EventArgs e) { this.pREDTableAdapter.Fill(this.eDUDataSet.PRED); } /// <summary> /// Событие закрытия формы /// </summary> /// <param name="sender">Форма</param> /// <param name="e">Аргумент</param> private void btnClose_Click(object sender, EventArgs e) { Close(); } /// <summary> /// Событие сохранения формы /// </summary> /// <param name="sender">Форма</param> /// <param name="e">Аргумент</param> private void btnSave_Click(object sender, EventArgs e) { // Если выбран студент if (StudId > 0) { // Создать соединение с базой данных using (SqlConnection cs = new SqlConnection(Properties.Settings.Default.EDUConnectionString)) { // Открыть соединение с базой данных cs.Open();
Продолжение таблицы 5.9
// Начать транзакцию SqlTransaction t = cs.BeginTransaction(); // Создать команду к базе SqlCommand cmd = cs.CreateCommand(); cmd.Transaction = t; // Если оценка не введена if (string.IsNullOrEmpty(textBox1.Text)) { // Составить команду удаления оценки по студенту и предмете cmd.CommandText = @" delete from VED where PredId = @PredId and StudId = @StudId"; } else { // Если оценка введена то составить команду // обновления или добавления записи в ведомость cmd.CommandText = @" if exists(select * from VED where PredId = @PredId and StudId = @StudId) update VED set Value = @Value where PredId = @PredId and StudId = @StudId else insert into VED (PredId, StudId, Value) values (@PredId, @StudId, @Value) "; } // Добавить параметр идентификации студента cmd.Parameters.AddWithValue("@StudId", StudId);   // Добавть параметр оценки int value = 0; int.TryParse(textBox1.Text, out value); cmd.Parameters.AddWithValue("@Value", value); // Добавть параметр индентификатора периода cmd.Parameters.AddWithValue("@PredId", int.Parse(cmbPred.SelectedValue.ToString())); try { // Выполнить запрос cmd.ExecuteNonQuery();  
Продолжение таблицы 5.9
// Подтвердить транзакцию t.Commit(); } catch(Exception ex) {// Откатить транзакцию t.Rollback(); throw ex; } } } } /// <summary> /// Событие изменения предмета /// </summary> /// <param name="sender">Элмент со списоком предметов</param> /// <param name="e">Аргумент</param> private void cmbPred_SelectedValueChanged(object sender, EventArgs e) {// Значение утанавливаемое в качестве оценки string strValue = string.Empty; // Проверить выбран ли студент и предмет if (StudId > 0 && cmbPred.SelectedValue!= null) {// Создать соединение с базой данных using (SqlConnection cs = new SqlConnection(Properties.Settings.Default.EDUConnectionString)) {// Открыть соединение с базой данных cs.Open(); // Создать команду к базе данных SqlCommand cmd = cs.CreateCommand(); // Создать запрос на выборку оценки по заданному предмету и студенту cmd.CommandText = @" select Value from VED where PredId = @PredId and StudId = @StudId"; // Добавить идентификатор студента cmd.Parameters.AddWithValue("@StudId", StudId); // Добавить идентификатор предмета cmd.Parameters.AddWithValue("@PredId", int.Parse(cmbPred.SelectedValue.ToString())); // Выполнить запрос object o = cmd.ExecuteScalar(); if (o!= null) if (o!= DBNull.Value) strValue = o.ToString(); } } // Установить текущую оценку студента textBox1.Text = strValue; } } }

Пример списка студентов с заполненной ведомостью представлен на рис.5.7.

Рисунок 5.7 -  Пример списка студентов с заполненной ведомостью


Поделиться с друзьями:

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.