Курсовая работа. Разработка программы мониторинга загрязнения окружающей среды

Курсовая работа. Разработка программы мониторинга загрязнения окружающей среды

В данной теме описывается детальный пошаговый процесс разработки программы, которая управляет локальной базой данных Microsoft SQL Server, размещенной в «*.mdf»-файле.

Программа реализована на языке программирования C# в системе визуальной разработки приложений Microsoft Visual Studio 2010.

Пройдя все этапы выполнения курсовой работы Вы получите опыт разработки приложений, которые взаимодействуют с базами данных типа Microsoft SQL Server. По данному примеру можно научиться создавать собственные приложения, работающие с базами данных Microsoft SQL Server.


Содержание


Условие задачи

Разработать программу, которая оперирует базой данных типа Microsoft SQL Server. База данных размещается в *.mdf-файле. Программу реализовать в системе визуальной разработки приложений Microsoft Visual Studio.

В работе нужно выполнить следующие задачи:

  • спроектировать и реализовать локальную базу данных типа Microsoft SQL Server, которая размещается в отдельном файле. Имя базы данных «MyDataBase.mdf»;
  • создать в базе данных 2 таблицы с именами «Source» (Источник) и «Emission» (Выбросы). Каждая из таблиц должна иметь заданные поля, которые описываются ниже. Таблицы базы данных должны быть связаны между собою по некоторому полю;
  • разработать приложение, оперирующее базой данных MyDataBase.mdf. Приложение реализовать на языке C# по шаблону Windows Forms Application;
  • в приложении реализовать основные команды управления записями (данными) в базе данных: добавление, редактирование, удаление, просмотр;
  • реализовать следующие вычисления: нахождение минимальных, максимальных, средних выбросов для любого источника.

База данных содержит 2 таблицы, имеющих следующую структуру.

Таблица Source (источник выбросов).

Таблица Emission (выбросы для заданного источника).

Таблицы связаны между собою по полю ID_Source.

 

Выполнение

1. Выбор модели базы данных

Для организации работы с данными при создании проектов (программ) система Microsoft Visual Studio предлагает различные виды источников данных. Например:

  • локальная база данных Microsoft SQL Server, которая размещается в отдельном «*.mdf» — файле. Пример работы с такой базой данных подробно описывается здесь;
  • локальная база данных Microsoft SQL Server. В этом случае может быть установлен локальный сервер, например SQLEXPRESS. Пример работы с такой базой данных подробно описывается здесь;
  • локальная база данных Microsoft Access. В этом случае создается «*.mdb» файл базы данных;
  • база данных, созданная с использованием ODBC-драйвера;
  • Oracle база данных.

Можно также создать собственную базу данных в виде структур или классов. Потом, для этой базы данных можно создать программный функционал, который будет обрабатывать записи базы данных, осуществлять удобный вывод, конвертировать в известные форматы и т.п. Это тема другой курсовой работы.

Для работы программы используем локальную базу данных, которая размещена в отдельном «*.mdb»— файле и предназначена для работы под управлением системы управления реляционными базами данных Microsoft SQL Server.

 

 

2. Проектирование (подключение) базы данных «MyDataBase.mdf». Создание нового проекта в Microsoft Visual Studio
2.1. Подготовка папки для файлов проекта и базы данных

Подготовить папку для программы. В данном случае устанавливаем папку проекта и файлов базы данных:

D:\Programs\C_SHARP\TermPaper01

 

2.2. Запуск Microsoft Visual Studio. Создание приложения по шаблону Windows Forms Application. Сохранение файлов проекта

Запустить систему визуальной разработки приложений Microsoft Visual Studio. Создать новый проект на языке C# по шаблону Windows Forms Application.

Новый проект создается командой

File->New Project

В нашем случае проект создается в папке

D:\Programs\C_SHARP\TermPaper01

Более подробный пример создания нового проекта описывается в статье:

В окне New Project задаем следующие настройки:

  • имя проекта (поле Name) TermPaper;
  • папка (Location) «D:\Programs\C_SHARP\TermPaper1\»;
  • имя решения (Solution name) TermPaper.

После создания нового проекта, главная форма программы имеет вид, как показано на рисунке 2.1.

Рис. 2.1. Главная форма программы

 

2.3. Создание новой или подключение ранее созданной базы данных «MyDataBase.mdf»

После создания папки для базы данных можно создавать новую базу данных или подключить уже существующую. Подробный пример создания/подключения базы данных, что размещается в отдельном «*.mdf»-файле, описывается в статьях:

Чтобы не тратить времени на создание новой базы данных, можно загрузить архив с готовой базой данных, которая была создана раньше.

База данных размещается в двух файлах:

  • файл «MyDataBase.mdf»;
  • файл «MyDataBase.ldf».

После распаковки архива копируем базу данных в папку с будущей программой:

D:\Programs\C_SHARP\TermPaper01

Подключение готовой, ранее созданной, базы данных к проекту осуществляется одной из команд:

  • в меню Tools выбрать команду «Connect to Database»;
  • в утилите Server Explorer выбрать кнопку «Connect to Database».

В результате откроется окно Add Connection, в котором нужно выбрать следующие настройки:

  • поле «Data Source» = «Microsoft SQL Server Database File»;
  • поле «Database File name (new of existing)» = «D:\Programs\C_SHARP\TermPaper1\MyDataBase.mdf». Здесь с помощью кнопки «Browse» выбирается путь к нашей базе данных MyDataBase.mdf;
  • опция «Log on to the server» = «Use Windows Autentification».

Подробный пример подключения готовой базы данных к проекту описывается в теме:

После подключения (или создания) базы данных в окне «Server Explorer» отобразится база данных «MyDataBase.mdf» (рисунок 2.2).

Рис. 2.2. База данных MyDataBase.mdf в окне «Server Explorer»

 

2.4. Информация о базе данных «MyDataBase.mdf»

База данных «MyDataBase.mdf» содержит:

  • таблицу Source (рис. 2.3);
  • таблицу Emission (рис. 2.4);
  • диаграмму Diagram1, содержащую информацию о связях между таблицами Source и Emission (рис. 2.5).

Рис. 2.3. Таблицы Source, Emission и диаграмма связей

Если раскрыть диаграмму связей, то отобразится связь между таблицами Source и Emission по полю ID_Source (рис. 2.5).

Чтобы отобразить диаграмму связей используется команда Design Database Diagram, из контекстного меню диаграммы (рис. 2.4). Также отображение диаграммы связей вызывается двойным кликом мышкой на Diagram1.

Рис. 2.4. Вызов команды отображения диаграммы связей между таблицами

Рис. 2.5. Диаграмма связей между таблицами

 

2.5. Подключение строки соединения с базой данных Connection String

В программе, для доступа к базе данных, будет использоваться строка соединения с базой данных Connection String. Эта строка содержит всю необходимую информацию о базе данных.

Подробное описание подключения строки Connection String к программе описывается в теме:

Чтобы подключить строку соединения с базой данных, нужно выполнить следующую последовательность шагов:

  1. Перейти в утилиту Server Explorer (рис. 2.6).
  2. Выделить файл «MyDataBase.mdf» (рис. 2.6).
  3. В окне «Properties» выделить строку (свойство) «Connection String» (контекстное меню – команда «Выделить все») и скопировать его в буфер обмена Clipboard (контекстное меню – команда «Копировать») (рис. 2.6).
  4. Перейти в текстовую часть файла «Form1.cs»

Создать переменную в классе формы Form1 типа string.

Пусть название переменной ConnStr. Вставить строку «Connection String» в строке инициализации значения переменной ConnStr как показано ниже:

// строка соединения с базой данных
string ConnStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Programs\C_SHARP\TermPaper1\TermPaper1\MyDataBase.mdf;Integrated Security=True;User Instance=True";

Рис. 2.6. Копирование строки (ConnectionString) соединения с базой данных в программу

На данный момент приблизительный вид файла «Form1.cs» следующий:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TermPaper1
{
    public partial class Form1 : Form
    {
        // строка соединения с базой данных
        string ConnStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Programs\C_SHARP\TermPaper1\TermPaper1\MyDataBase.mdf;Integrated Security=True;User Instance=True";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

После этого можно проектировать интерфейс программы и программировать методы обработки базы данных.

 

3. Проектирование главной формы программы. Размещение элементов управления на форме

С помощью инструментов на панели ToolBox на главной форме программы необходимо разместить следующие элементы управления (рис. 3.1):

  • label1 типа Label. Содержит текст «Источник выбросов»;
  • label2 типа Label. Содержит текст «Выбросы»;
  • dataGridView1 типа DataGridView. Этот элемент управления отображает таблицу базы данных «Источник выбросов»;
  • dataGridView2 типа DataGridView – отображает таблицу базы данных «Выбросы»;
  • button1 – кнопка, которая содержит текст «Добавить источник…» (свойство Text);
  • button2 – кнопка, которая содержит текст «Удалить источник»(свойство Text);
  • button3 – кнопка, которая содержит текст «Редактировать источник…»;
  • button4 – кнопка, которая содержит текст «Добавить выбросы…»;
  • button5 – кнопка, которая содержит текст «Удалить выбросы…»;
  • button6 – кнопка с текстом «Редактировать выбросы …»;
  • button7 – кнопка с текстом «Минимальные выбросы»;
  • button8 – кнопка с текстом «Максимальные выбросы»;
  • button9 – кнопка с текстом «Средние выбросы»;
  • элемент управления menuStrip1 типа MenuStrip.

Для элементов управления label1, label2, button1, button2, button3, button4, button5, button6, button7, button8, button9 настраивается свойство Text в соответствующее значение. Работа с этими элементами управления более подробно описывается в практическом примере:

В элементах управления dataGridView1, dataGridView2 настраивается свойство

EditMode = EditProgrammatically

Это означает, что ячейки с отображаемыми данными не будут иметь возможности редактироваться с помощью клавиатуры. Редактирование ячеек будет осуществляться программным путем.

Элемент управления menuStrip1 предназначен для создания меню в программе. В данной работе создаем меню, как показано на рисунке 3.2. Работа с элементом управления menuStrip1 подробно описывается в статье:

Также нужно настроить следующие свойства формы (элемент управление Form1):

  • свойство Text = «Программа мониторинга загрязнения окружающей среды»;
  • свойство MaximizeBox = False.

Рис. 3.1. Главная форма программы после проектирования

Рис. 3.2. Главное меню программы. Подменю «Источник», «Выбросы», «Расчет»

 

 

4. Разработка второстепенных форм (диалоговых окон)
4.1. Проектирование формы окна «Добавить источник…»

Добавление в базу данных нового источника выбросов осуществляется после нажатия на кнопке «Добавить источник…». Набор новой информации об источнике может осуществляться в отдельной форме.

Для создания новой формы нужно вызвать команду

Project -> Add Windows Form...

В открывшемся окне нужно выбрать шаблон Windows Form.

Более подробный пример создания новой формы и вызова формы описывается в статье:

Используя средства панели инструментов Toolbox создаем новую форму, как показано на рисунке 4.1.

Форма носит имя Form2. Название файла формы «Form2.cs».

Рис. 4.1. Форма добавления нового источника выбросов

В форме Form2 размещаются следующие элементы управления:

  • два элемента управления типа Label с именами label1, label2. Предназначены для вывода информационных сообщений;
  • два элемента управления типа Button с именами button1, button2;
  • два элемента управления типа TextBox с именами textBox1, textBox2.

Настраиваем следующие свойства:

  • в форме Form2 свойство Text = «Добавить источник»;
  • в форме Form2 свойство StartPosition = CenterScreen. Это означает, что форма будет открываться по центру экрана;
  • в элементе управления label1 свойство Text = «Название источника»;
  • в элементе управления label2 свойство Text = «Адрес»;
  • в button1 свойство Text = «Добавить»;
  • в button1 свойство DialogResult = «OK». Это означает, что при нажатии на кнопке button1 форма будет закрываться с кодом возвращения OK;
  • в button2 свойство Text = «Отменить»;
  • в button2 свойство DialogResult = «No».
  • в элементе управления textBox1 свойство Modifiers = public. Это означает, что элемент имеет модификатор доступа public. После этого можно иметь доступ к textBox1 из других форм (модулей, файлов);
  • в элементе управления textBox2 свойство Modifiers = Public (видимый извне).

 

4.2. Проектирование формы окна «Редактировать источник …»

По образцу предшествующего пункта (п. 4.1) создается новая форма «Редактировать источник …». Форма носит имя Form3. Файл формы носит имя «Form3.cs».

После размещения и настройки элементов управления, вид окна формы будет таким как показано на рисунке 4.2.

Рис. 4.2. Форма «Редактировать источник»

На форме размещаются следующие элементы управления:

  • два элемента управления типа Label с именами label1, label2;
  • два элемента управления типа Button с именами button1, button2;
  • два элемента управления типа TextBox с именами textBox1, textBox2.

Настроить следующие свойства элементов управления:

  • в Form3 свойство Text = «Редактировать источник»;
  • в Form3 свойство StartPosition = CenterScreen;
  • в элементе управления button1 свойство Text = «Изменить»;
  • в button1 свойство DialogResult = OK;
  • в button2 свойство Text = «Отменить»;
  • в button2 свойство DialogResult = No;
  • в label1 свойство Text = «Название источника»;
  • в label2 свойство Text = «Адрес»;
  • в textBox1 свойство Modifiers = public;
  • в textBox2 свойство Modifiers = public.

 

4.3. Проектирование формы окна «Добавить выбросы…»

По образцу предшествующих форм проектируется новая форма добавления строки выбросов (рис. 4.3). Эта форма должна быть активирована после нажатия на кнопке «Добавить выбросы…». В программе имя формы Form4. Файл формы «Form4.cs».

Рис. 4.3. Вид формы добавления нового выброса для заданного источника

На форме размещаются следующие элементы управления:

  • 4 элемента управления типа Label с именами label1, label2, label3, label4;
  • 3 элемента управления типа TextBox с именами textBox1, textBox2, textBox3;
  • 2 элемента управления типа Button с именами button1, button2.

Настроить следующие свойства формы и элементов управления:

  • в форме Form4 свойство Text = «Добавить выбросы»;
  • в форме Form4 свойство StartPosition = CenterScreen;
  • в label1 свойство Text = «Количество выбросов»;
  • в label2 свойство Text = «Комментарий»;
  • в label3 свойство Text = «Дата»;
  • в label4 свойство Text = «Источник»;
  • в label4 свойство Modifiers = Public (видимый извне);
  • в button1 свойство Text = «Добавить»;
  • в button2 свойство Text = «Отменить»;
  • в button1 свойство DialogResult = OK;
  • в button2 свойство DialogResult = No;
  • в textBox1 свойство Modifiers = Public;
  • в textBox2 свойство Modifiers = Public;
  • в textBox3 свойство Modifiers = Public.

 

4.4. Проектирование формы окна подтверждения «Удалить источник»

После того, как пользователь вызовет команду «Удалить источник», должно открыться окно подтверждения команды. Для этого создается новая форма с именем Form5. Файл формы носит имя «Form5.cs». Вид формы Form5 изображен на рисунке 4.4.

Рис. 4.4. Форма подтверждения «Удалить источник»

На форме размещаются следующие элементы управления:

  • два элемента управления типа Label с именами label1, label2;
  • два элемента управления типа Button с именами button1, button2.

Настроить следующие свойства формы и элементов управления:

  • в форме Form5 свойство Text = «Удалить источник заражения»;
  • в форме Form5 свойство StartPosition = CenterScreen;
  • в элементе управления label1 свойство Text = «Вы действительно хотите удалить источник:»;
  • в элементе управления label2 свойство Modifiers = Public;
  • в button1 свойство Text = «Да»;
  • в button1 свойство DialogResult = OK;
  • в button2 свойство Text = «Нет»;
  • в button2 свойство DialogResult = No.

 

4.5. Проектирование формы окна подтверждения «Удалить выбросы»

По образцу п.4.4. разрабатывается форма удаления выбросов (рис. 4.5). Имя формы Form6.cs. Файл формы «Form6.cs».

Рис. 4.5. Форма подтверждения «Удалить выбросы»

На форме размещаются следующие элементы управления:

  • два элемента управления типа Label с именами label1, label2;
  • два элемента управления типа Button с именами button1, button2.

Настроить следующие свойства формы и элементов управления:

  • в форме Form6 свойство Text = «Удалить выбросы»;
  • в форме Form6 свойство StartPosition = CenterScreen;
  • в элементе управления label1 свойство Text = «Вы действительно желаете удалить строку с выбросами?»;
  • в элементе управления label2 свойство Modifiers = Public;
  • в button1 свойство Text = «Да»;
  • в button1 свойство DialogResult = OK;
  • в button2 свойство Text = «Нет»;
  • в button2 свойство DialogResult = No.

 

4.6. Проектирование формы окна «Редактировать выбросы»

Форма редактирования строки выбросов имеет вид, как показано на рисунке 4.6. В программе форма носит имя Form7 и размещается в файле «Form7.cs».

Рис. 4.6. Окно «Редактировать выбросы…»

На форме размещаются следующие элементы управления:

  • 4 элемента управления типа Label с именами label1, label2, label3, label4;
  • 3 элемента управления типа TextBox с именами textBox1, textBox2, textBox3;
  • 2 элемента управления типа Button с именами button1, button2.

Настроить следующие свойства формы и элементов управления:

  • в форме Form7 свойство Text = «Редактировать выбросы»;
  • в форме Form7 свойство StartPosition = CenterScreen;
  • в label1 свойство Text = «Источник»;
  • в label2 свойство Text = «Количество выбросов»;
  • в label3 свойство Text = «Комментарий»;
  • в label4 свойство Text = «Дата»;
  • в label1 свойство Modifiers = Public (видимый извне);
  • в button1 свойство Text = «Изменить»;
  • в button2 свойство Text = «Отменить»;
  • в button1 свойство DialogResult = OK;
  • в button2 свойство DialogResult = No;
  • в textBox1 свойство Modifiers = Public;
  • в textBox2 свойство Modifiers = Public;
  • в textBox3 свойство Modifiers = Public.

 

4.7. Проектирование формы «Минимальные выбросы»

В соответствии с условием задачи, в программе проводится расчет минимальных выбросов для любого источника. Результат отображается в отдельном окне «Минимальные выбросы». Для отображения результата к проекту добавляется соответствующая форма с именем Form8, которая изображена на рисунке 4.7. Файл формы «Form8.cs».

Рис. 4.7. Окно формы «Минимальные выбросы»

На форме размещаются следующие элементы управления:

  • элемент управления типа Label с именем label1;
  • элемент управления типа DataGridView с именем dataGridView1;
  • элемент управления типа Button с именем button1.

Настраиваются следующие свойства формы и элементов управления:

  • в форме Form8 свойство Text = «Минимальные выбросы»
  • в форме Form8 свойство StartPosition = CenterScreen;
  • в элементе управления label1 свойство Text = «Минимальные выбросы»;
  • в button1 свойство Text = «OK»;
  • в button1 свойство DialogResult = OK;
  • в dataGridView1 свойство Modifiers = Public.

 

4.8. Проектирование формы «Максимальные выбросы»

Форма «Максимальные выбросы» предназначена для отображения максимальных выбросов для любого источника (рис. 4.8). В программе данная форма носит имя Form9. Файл формы носит имя «Form9.cs».

Рис. 4.8. Окно формы «Максимальные выбросы»

На форме размещаются следующие элементы управления:

  • элемент управления типа Label с именем label1;
  • элемент управления типа DataGridView с именем dataGridView1;
  • элемент управления типа Button с именем button1.

Настраиваются следующие свойства формы и элементов управления:

  • в форме Form9 свойство Text = «Максимальные выбросы»
  • в форме Form9 свойство StartPosition = CenterScreen;
  • в элементе управления label1 свойство Text = «Максимальные выбросы»;
  • в button1 свойство Text = «OK»;
  • в button1 свойство DialogResult = OK;
  • в dataGridView1 свойство Modifiers = Public.

 

4.9. Проектирование формы «Средние выбросы»

Форма «Средние выбросы» предназначена для отображения средних выбросов для любого источника (рис. 4.9). Рассчитывается среднее арифметическое значение. В программе данная форма называется Form10. Файл формы «Form10.cs».

Рис. 4.9. Окно формы «Средние выбросы»

На форме размещаются следующие элементы управления:

  • элемент управления типа Label с именем label1;
  • элемент управления типа DataGridView с именем dataGridView1;
  • элемент управления типа Button с именем button1.

Настраиваются следующие свойства формы и элементов управления:

  • в форме Form10 свойство Text = «Средние выбросы»
  • в форме Form10 свойство StartPosition = CenterScreen;
  • в элементе управления label1 свойство Text = «Средние выбросы»;
  • в button1 свойство Text = «OK»;
  • в button1 свойство DialogResult = OK;
  • в dataGridView1 свойство Modifiers = Public.

 

5. Написание программного кода
5.1. Подключение пространства имен System.Data.SqlClient

Чтобы на программном уровне работать с «*.mdf»-файлами базы данных Microsoft SQL Server, в верхней части файла «Form1.cs» нужно подключить пространство имен System.Data.SqlClient

using System.Data.SqlClient;

На данный момент текст модуля основной формы Form1.cs имеет приблизительно такой вид:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// пространство имен для работы с базой данных MS SQL
using System.Data.SqlClient;
namespace TermPaper1
{
    public partial class Form1 : Form
    {
        // строка соединения с базой данных
        string ConnStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Programs\C_SHARP\TermPaper1\TermPaper1\MyDataBase.mdf;Integrated Security=True;User Instance=True";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
}

 

5.2. Разработка метода заполнения dataGridView1 из таблицы Source

После загрузки программы, внесения изменений в таблицы и т.п., данные из базы данных должны отображаться в таблицах Source и Emission. Поэтому нужно создать методы, которые читают данные из этих таблиц на основе простого запроса на языке SQL.

Метод FillSource(), читающий данные из таблицы Source имеет вид

// Показать таблицу Source
private void FillSource()
{
    string SqlText = "SELECT * FROM [Source]";
    SqlDataAdapter da = new SqlDataAdapter(SqlText,ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds,"[Source]");
    dataGridView1.DataSource = ds.Tables["[Source]"].DefaultView;
}

Этот метод нужно добавить в текст класса формы Form1 после метода Form1_Load().

Объясним некоторые фрагменты кода метода FillSource().

Обращение к базе данных осуществляется с помощью метода FillSource(). Переменная SqlText содержит строку на языке SQL чтения данных из таблицы Source

SELECT *
FROM [Source]

В методе объявляется экземпляр класса SqlDataAdapter с именем da. Класс SqlDataAdapter представляет набор команд над данными и соединением с базой данных, которые используются для заполнения объекта класса System.Data.DataSet и обновления базы данных SQL Server.

Экземпляр класса DataSet называется ds. Класс DataSet реализует кэш данных в памяти.

В программном коде используется метод Fill() класса SqlDataAdapter. Этот метод добавляет или обновляет строки в System.Data.DataSet в соответствии с именами в источнике данных. Метод Fill() получает два параметра типа System.Data.DataSet и System.Data.DataTable. Первый параметр необходим, чтобы заполнить записи таблицы или схему. Второй параметр содержит название таблицы.

 

5.3. Разработка метода заполнения элемента управления dataGridView2 из таблицы Emission

Для отображения данных таблицы Emission в dataGridView2 разработаем метод по образцу предшествующего пункта (п. 5.2). Метод имеет название FillEmission()

// Показать таблицу Emissions
private void FillEmission()
{
    // сформировать строку SQL-запроса
    string SqlText = "SELECT * FROM [Emission]";
    int index;
    string ID_Source;

    index = dataGridView1.CurrentRow.Index;
    ID_Source = dataGridView1[0, index].Value.ToString();

    SqlText = "SELECT * FROM [Emission],[Source] WHERE (([Emission].ID_Source = ";
    SqlText = SqlText + ID_Source + ") AND ([Source].ID_Source = " + ID_Source + "))";

    SqlDataAdapter da = new SqlDataAdapter(SqlText, ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds, "[Emission]");
    dataGridView2.DataSource = ds.Tables["[Emission]"].DefaultView;
}

В этом методе в переменной SqlText программно формируется следующий запрос на языке SQL:

SELECT *
FROM [Emission], [Source]
WHERE ([Emission].ID_ Source = ID_Source) AND
      ([Source].ID_Source = ID_Source)

где ID_Source – уникальное значение счетчика в таблицах Emission и Source.

Чтобы получить значение ID_Source, сначала вычисляется индекс строки в таблице Source

index = dataGridView1.CurrentRow.Index;

потом вычисляется значение ID_Source, которое по порядку идет в позиции 0 таблицы Source:

ID_Source = dataGridView1[0, index].Value.ToString();

Следующие шаги выполняются по образцу п. 5.2. Только данные выводятся в элементе управления dataGridView2.

 

5.4. Модификация метода Form_Load() основной формы Form1

В классе основной формы Form1 есть метод Form_Load(), который вызывается сразу после запуска программы на выполнение. Поэтому, сюда нужно вписать вызов методов FillSource() и FillEmission().

Общий вид метода Form_Load():

private void Form1_Load(object sender, EventArgs e)
{
    FillSource();
    FillEmission();
}

 

5.5. Разработка метода MyExecuteNonQuery() изменения данных в таблицах

В программе предполагается редактирование (изменение) данных в таблицах с помощью SQL-команд INSERT, UPDATE, DELETE. Поэтому, нужно реализовать общий метод, который будет вызваться для любой из данных команд. Метод называется MyExecuteNonQuery(). Листинг метода следующий:

// Метод, для удобной обработки команд INSERT, UPDATE, DELETE
// метод получает SQL-запрос
public void MyExecuteNonQuery(string SqlText)
{
    SqlConnection cn; // экземпляр класса типа SqlConnection
    SqlCommand cmd;

    // выделение памяти с инициализацией строки соединения с базой данных
    cn = new SqlConnection(ConnStr);
    cn.Open(); // открыть источник данных
    cmd = cn.CreateCommand(); // задать SQL-команду
    cmd.CommandText = SqlText; // задать командную строку
    cmd.ExecuteNonQuery(); // выполнить SQL-команду
    cn.Close(); // закрыть источник данных
}

Объясним работу метода. Метод получает текст SQL-команды в переменной SqlText. Это может быть одна из команд INSERT, UPDATE, DELETE.

После этого создается экземпляр класса SqlConnection, что символизирует соединение с базой данных. Объект класса имеет название cn.

Другой класс SqlCommand предназначен для корректного сохранения SQL-команды в переменной CommandText. Соответственно создается объект этого класса с именем cmd. В классе SqlCommand есть метод ExecuteNonQuery(), который выполняет SQL-команду.

Перед внесением изменений в источник данных, его нужно открыть командой Open(). После внесения изменений, источник данных (база данных) закрывается методом Close().

Метод MyExecuteNonQuery() может быть вызван из других методов с помощью строки:

// выполнить SQL-команду
MyExecuteNonQuery(SqlText);

где SqlText – текст соответствующей SQL-команды (INSERT, UPDATE, DELETE).

 

5.6. Программирование события клика на кнопке button1 («Добавить источник…»)

Чтобы вызвать окно добавления нового источника нужно сделать клик на кнопке button1 («Добавить источник…»). В результате откроется окно добавления нового источника (см. п. 4.1).

Листинг обработчика события клика на кнопке button1 имеет вид:

// Кнопка "Добавить источник..."
private void button1_Click(object sender, EventArgs e)
{
    string SqlText = "INSERT INTO [Source] ([ID_Source],[Name],[Address]) VALUES (1, 'Source-01','Address-01') ";
    Form2 f = new Form2(); // создать экземпляр окна

    if (f.ShowDialog() == DialogResult.OK)
    {
        // сформировать SQL-строку
        SqlText = "INSERT INTO [Source] ([Name], [Address]) VALUES (";
        SqlText = SqlText + "\'" + f.textBox1.Text + "\', ";
        SqlText = SqlText + "\'" + f.textBox2.Text + "\')";

        // выполнить SQL-команду
        MyExecuteNonQuery(SqlText);
        // отобразить таблицу Source
        FillSource();
    }
}

Объясним некоторые фрагменты кода.

Добавление источника осуществляется на основе SQL-команды:

INSERT INTO [Source] ([Name], [Address])
VALUES (name, address)

где name, address – значение полей textBox1, textBox2 формы Form2. В эти поля пользователь вводит название и адрес нового источника.

SQL-команда программно формируется в переменной SqlText. Выполнение команды осуществляется в методе MyExecuteNonQuery(), получающем параметром значения переменной SqlText (см. п. 5.5).

Создание новой формы осуществляется стандартным для C# .NET путем:

Form2 f = new Form2();

Вызов окна формы осуществляется методом ShowDialog() формы Form2:

f.ShowDialog()

После добавления источника в базу данных выполняется перерисовывание элемента управление dataGridView1 главной формы программы Form1 с помощью метода FillSource().

 

5.7. Программирование события клика на кнопке button3 («Редактировать источник…»)

По образцу предшествующего пункта, программируется событие клика на кнопке button3. Обработчик события имеет вид:

// Команда "Редактировать источник..."
private void button3_Click(object sender, EventArgs e)
{
    int index, n;
    string SqlText = "UPDATE [Source] SET ";
    string ID_Source, name, address;

    // проверка, есть ли вообще записи в таблице Source
    n = dataGridView1.Rows.Count;
    if (n == 1) return;

    Form3 f = new Form3();

    // заполнить форму данными перед открытием
    index = dataGridView1.CurrentRow.Index;
    ID_Source = dataGridView1[0, index].Value.ToString();
    name = dataGridView1[1, index].Value.ToString();
    address = dataGridView1[2, index].Value.ToString();

    f.textBox1.Text = name;
    f.textBox2.Text = address;

    if (f.ShowDialog() == DialogResult.OK)
    {
        name = f.textBox1.Text;
        address = f.textBox2.Text;
        SqlText += "Name = \'" + name + "\', Address = '" + address + "\' ";
        SqlText += "WHERE [Source].ID_Source = " + ID_Source;
        MyExecuteNonQuery(SqlText);
        FillSource();
    }
}

В обработчике события открывается форма Form3 («Редактировать источник»), которая была спроектировано в п. 4.2.

Перед открытием формы заполняются переменные index, ID_Source, name, address. Потом значение переменных записывается в textBox1, textBox2 формы Form3. Все другие команды выполняются по образцу предшествующего пункта (п. 5.6).

Текст SQL-команды имеет вид:

UPDATE [Source]
SET Name = name, Address = address
WHERE [Source].ID_Source = ID_Source

где name, address – измененное название и адрес источника.

 

5.8. Настройка свойства DeleteRule в объекте FK_Emission_Source (связь между диаграммами) для корректного удаления источника

Для того, чтобы удалить источник из таблицы [Source], нужно выполнить следующий SQL-запрос:

DELETE FROM [Source]
WHERE [Source].ID_Source = ID_Source

где ID_Source – уникальный идентификатор источника, который вычисляется программно.

При удалении источника из таблицы Source может возникнуть проблема. Эта проблема состоит в том, что при удалении источника из таблицы Source должны быть удалены все записи из таблицы Emission. Поэтому, вышеприведенный SQL-запрос пока что работать не будет: база данных будет выдавать ошибку, что с таблицей Source связаны данные в таблице Emission.

Чтобы избежать эту проблему, нужно правильно настроить связь между диаграммами. В программе, объект, который отвечает за связь между диаграммами имеет название FK_Emission_Source. Для правильной настройки связи нужно выполнить следующие действия:

  1. Перейти в утилиту Server Explorer. Для базы данных «MyDataBase.mdf» раскрыть вкладку «Database Diagrams” (рис. 5.1).
  2. Вызвать контекстное меню, с помощью клика правой кнопкой мышки на элементе Diagram1. В контекстном меню выбрать команду «Design Database Diagram» (рис. 5.1). В результате откроется окно с диаграммой dbo.Diagram1, которое связывает таблицы Source и Emission.

Рис. 5.1. Вызов диаграммы связи между таблицами

  1. В окне dbo.Diagram1выделить связь между диаграммами FK_Emission_Source (рис. 5.2)
  2. В окне свойств во вкладке «INSERT AND UPDATE» установить значение свойства Delete Rule = Cascade (каскадное удаление полей).

После этого можно программировать событие клика на кнопке button2«Удалить источник» (см. п. 5.9).

Рис. 5.2. Настройка свойства DeleteRule в значение Cascade

 

5.9. Программирование события клика на кнопке button2 («Удалить источник»)

Теперь все подготовительные операции для реализации команды удаления источника из таблицы [Source] выполнены (см. п. 5.8).

Команда удаления источника базируется на SQL-запросе:

DELETE FROM [Source]
WHERE [Source].ID_Source = ID_Source

где ID_Source – уникальный идентификатор источника, который программно вычисляется в следующих строках:

index = dataGridView1.CurrentRow.Index;
ID_Source = Convert.ToString(dataGridView1[0, index].Value);

Листинг обработчика события клика на кнопке «Удалить источник» имеет вид:

// Кнопка "Удалить источник"
private void button2_Click(object sender, EventArgs e)
{
    int index, n;
    string ID_Source;
    string name, address;
    string SqlText = "DELETE FROM [Source] WHERE [Source].ID_Source = ";

    // проверка, есть ли вообще записи в таблице Source
    n = dataGridView1.Rows.Count;
    if (n == 1) return;

    Form5 f = new Form5();

    index = dataGridView1.CurrentRow.Index;
    ID_Source = Convert.ToString(dataGridView1[0, index].Value);

    // сформировать SQL-команду
    SqlText = SqlText + ID_Source;

    // заполнить информационную справку в окне Form5
    name = Convert.ToString(dataGridView1[1, index].Value);
    address = Convert.ToString(dataGridView1[2, index].Value);
    f.label2.Text = ID_Source + " - " + name + " - " + address;

    if (f.ShowDialog() == DialogResult.OK) // вывести форму
    {
        // выполнить SQL-команду
        MyExecuteNonQuery(SqlText);
        // отобразить таблицу Source
        FillSource();
    }
}

Перед удалением источника вызывается окно подтверждения команды (форма Form5). Форма Form5 подтверждения команды удаления источника была спроектирована в п. 4.4. Предварительно формируется информационная справка об источнике, который удаляется.

 

5.10. Программирование события клика на кнопке button4 («Добавить выбросы…»)

После нажатия на кнопке «Добавить выбросы…» вызывается форма Form4 добавления выбросов (см. п. 4.3).

Листинг обработчика события добавления выбросов (кнопка button4) имеет вид:

// Команда "Добавить выбросы"
private void button4_Click(object sender, EventArgs e)
{
    string SqlText = "";
    int index; // номер выделенной строки в таблице Source
    string ID_Source;
    string name;

    Form4 f = new Form4();

    // 1.1. Найти активную строку в Source и взять из нее ID_Source
    index = dataGridView1.CurrentRow.Index;
    ID_Source = Convert.ToString(dataGridView1[0, index].Value);
    name = Convert.ToString(dataGridView1[1, index].Value);

    if (f.ShowDialog() == DialogResult.OK)
    {
        // Добавить данные в таблицу
        // Сформировать SQL-строку
        SqlText = "INSERT INTO [Emission] ([ID_Source], [count], [Text], [date]) VALUES (";
        // Сформировать значения переменной SqlText
        SqlText = SqlText + ID_Source + ", "; // ID_Source
        SqlText = SqlText + f.textBox1.Text + ", ";     // count
        SqlText = SqlText + "\'" + f.textBox2.Text + "\', ";   // Text
        SqlText = SqlText + "\'" + f.textBox3.Text + "\')";       // date

        // выполнить SQL-команду
        MyExecuteNonQuery(SqlText);
        // вывести таблицу Emission
        FillEmission();
    }
}

Добавление строки выбросов в таблицу Emission выполняется с помощью SQL-команды:

INSERT INTO [Emission] ([ID_Source], [count], [Text], [date])
VALUES (ID_Source, f.textBox1.Text, f.textBox2.Text, f.textBox3.Text)

где

  • ID_Source – уникальный идентификатор источника выбросов (вычисляется программно);
  • f.textBox1.Text – значение, введенное пользователем в поле textBox1 формы Form4. Это значение отвечает полю count таблицы Emission;
  • f.textBox2.Text – значение, введенное пользователем в поле textBox2 формы Form4. Это значение отвечает полю Text таблицы Emission;
  • f.textBox3.Text – значение, введенное пользователем в поле textBox3 формы Form4. Это значение отвечает полю date таблицы Emission.

 

5.11. Программирование события клика на кнопке button6 («Редактировать выбросы…»)

После выбора команды «Редактировать выбросы…» открывается соответствующее окно (форма Form7), которое было спроектировано в п. 4.6.

Листинг обработчика события клика на кнопке button6 имеет вид:

// Кнопка "Редактировать выбросы..."
private void button6_Click(object sender, EventArgs e)
{
    int index, index_src, n;
    string SqlText = "UPDATE [Emission] SET ";
    string ID_Emission, ID_Source, count, Text, date;
    string Name_Source;

    // проверка, есть ли вообще записи в таблице Emission
    n = dataGridView2.Rows.Count;
    if (n == 1) return;

    Form7 f = new Form7();

    // заполнить форму данными перед открытием
    index = dataGridView2.CurrentRow.Index;
    ID_Emission = dataGridView2[0, index].Value.ToString();
    ID_Source = dataGridView2[1, index].Value.ToString();
    count = dataGridView2[2, index].Value.ToString();
    Text = dataGridView2[3, index].Value.ToString();
    date = dataGridView2[4, index].Value.ToString();

    index_src = dataGridView1.CurrentRow.Index;
    Name_Source = dataGridView1[1, index_src].Value.ToString();

    f.label1.Text = Name_Source;
    f.textBox1.Text = count;
    f.textBox2.Text = Text;
    f.textBox3.Text = date;

    if (f.ShowDialog() == DialogResult.OK)
    {
        count = f.textBox1.Text;
        Text = f.textBox2.Text;
        date = f.textBox3.Text;

        SqlText += "count = " + count + ", Text = \'" + Text + "\', date = \'" + date + "\' ";
        SqlText += "WHERE [Emission].ID_Emission = " + ID_Emission;

        MyExecuteNonQuery(SqlText);
        FillEmission();
    }
}

Команда «Редактировать выбросы…» основывается на SQL-команде:

UPDATE [Emission]
SET count = count1, Text = Text1, date = date1
WHERE [Emission].ID_Emission = ID_Emission

где

  • count1 значение, введенное пользователем в поле textBox1 формы Form7. Это значение отвечает полю [Emission].[count];
  • Text1значение, введенное пользователем в поле textBox2 формы Form7. Это значение отвечает полю [Emission].[Text];
  • date1 – значение, введенное пользователем в поле textBox3 формы Form7. Это значение отвечает полю [Emission].[date];
  • ID_Source – уникальный идентификатор источника из таблицы Source. Это значение отвечает полю [Emission].ID_Source.

 

5.12. Программирование события клика на кнопке button5 («Удалить выбросы»)

Листинг обработчика события удаления строки выбросов из таблицы Emission:

// Кнопка "Удалить выбросы"
private void button5_Click(object sender, EventArgs e)
{
    int index, n;
    string ID_Emission;
    string count, text;
    string SqlText = "DELETE FROM [Emission] WHERE [Emission].ID_Emission = ";

    // проверка, есть ли записи в таблице Emission
    n = dataGridView2.Rows.Count;
    if (n == 1) return;

    Form6 f = new Form6();

    index = dataGridView2.CurrentRow.Index;
    ID_Emission = Convert.ToString(dataGridView2[0, index].Value);

    // сформировать SQL-команду
    SqlText += ID_Emission;

    // заполнить информационную справку в окне Form6
    count = Convert.ToString(dataGridView2[2, index].Value);
    text = Convert.ToString(dataGridView2[3, index].Value);

    f.label2.Text = ID_Emission + " - " + count + " - " + text;

    if (f.ShowDialog() == DialogResult.OK)
    {
        MyExecuteNonQuery(SqlText); // выполнить SQL-команду
        FillEmission(); // отобразить таблицу Emission
    }
}

Команда «Удалить выбросы» основывается на SQL-команде:

DELETE FROM [Emission]
WHERE [Emission].ID_Emission = ID_Emission

где ID_Emission – уникальный идентификатор строки выбросов в таблице Emission. ID_Emission формируется программно на основе активной строки элемента управления dataGridView2:

index = dataGridView2.CurrentRow.Index;
ID_Emission = Convert.ToString(dataGridView2[0, index].Value);

 

5.13. Программирование события клика на кнопке button7 («Минимальные выбросы»)

Чтобы вычислить минимальные выбросы для любого источника, используется SQL-запрос:

SELECT [Emission].ID_Source, MIN(Emission].count AS 'Минимальные выбросы'
FROM [Emission]
GROUP BY [Emission].ID_Source

Для поиска минимума, в данном запросе используется функция агрегирования MIN из библиотеки языка SQL.

Листинг обработчика события клика на кнопке button7 следующий:

// Кнопка "Минимальные выбросы"
private void button7_Click(object sender, EventArgs e)
{
    // SQL-запрос - определяет минимальные выбросы для любого источника
    string SqlText;

    SqlText = "SELECT [Emission].ID_Source, MIN([Emission].count) AS \'Минимальные выбросы\' ";
    SqlText += " FROM [Emission]";
    SqlText += " GROUP BY [Emission].ID_Source";

    Form8 f = new Form8();

    SqlDataAdapter da = new SqlDataAdapter(SqlText, ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds, "[Emission]");

    f.dataGridView1.DataSource = ds.Tables["[Emission]"].DefaultView;
    f.ShowDialog();
}

Результат выводится в форме Form8, которая была спроектирована в п. 4.7.

 

5.14. Программирование события клика на кнопке button8 («Максимальные выбросы»)

По образцу предшествующего пункта (п. 5.13) реализован обработчик события клика на кнопке button8.

Максимальные выбросы вычисляются на основе SQL-запроса:

SELECT [Emission].ID_Source, MAX(Emission].count AS 'Максимальные выбросы'
FROM [Emission]
GROUP BY [Emission].ID_Source

Для поиска максимума, в SQL-запросе используется функция агрегирования MAX.

Листинг обработчика события следующий:

// Кнопка "Максимальные выбросы"
private void button8_Click(object sender, EventArgs e)
{
    // SQL-запрос - определяет максимальные выбросы для любого источника
    string SqlText = "SELECT [Emission].ID_Source, MAX([Emission].count) AS \'Максимальные выбросы\' ";
    SqlText += " FROM [Emission]";
    SqlText += " GROUP BY [Emission].ID_Source";

    Form9 f = new Form9();

    SqlDataAdapter da = new SqlDataAdapter(SqlText, ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds, "[Emission]");
    f.dataGridView1.DataSource = ds.Tables["[Emission]"].DefaultView;
    f.ShowDialog();
}

 

5.15. Программирование события клика на кнопке button9 «Средние выбросы»

Средние выбросы вычисляются на основе SQL-запроса:

SELECT [Emission].ID_Source, AVG(Emission].count AS 'Средние выбросы'
FROM [Emission]
GROUP BY [Emission].ID_Source

Для поиска среднего арифметического значения, в SQL-запросе используется функция агрегирования AVG.

Листинг обработчика события следующий:

// Кнопка "Средние выбросы"
private void button9_Click(object sender, EventArgs e)
{
    // SQL-запрос - определяет средние выбросы для любого источника
    string SqlText = "SELECT [Emission].ID_Source, AVG([Emission].count) AS \'Средние выбросы\' ";
    SqlText += " FROM [Emission]";
    SqlText += " GROUP BY [Emission].ID_Source";

    Form10 f = new Form10();

    SqlDataAdapter da = new SqlDataAdapter(SqlText, ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds, "[Emission]");
    f.dataGridView1.DataSource = ds.Tables["[Emission]"].DefaultView;
    f.ShowDialog();
}

 

5.16. Программирование события выбора строки в dataGridView1 (таблица Source)

Если пользователь выбирает строку в таблице Source (элемент управления dataGridView1), должны выводиться связанные строки таблицы Emission, которые имеют такое самое значение ID_Source. Данные таблицы Emission выводятся в элементе управления dataGridView2.

Поэтому, целесообразно запрограммировать событие Click элемента управления dataGridView1 (рис. 5.3). Обработчик этого события имеет название dataGridView1_Click().

Рис. 5.3. Событие Click элемента управления dataGridView1

Листинг обработчика события клика мышкой на dataGridView1 следующий:

// клик мышкой на dataGridView1
private void dataGridView1_Click(object sender, EventArgs e)
{
    // на основе выделенной строки в таблице Source вывести таблицу Emission
    // определить количество строк в dataGridView1
    int n = dataGridView1.RowCount;
    int row = dataGridView1.CurrentRow.Index;

    if (n != (row + 1)) // Проверка, был ли клик на последней строке
    FillEmission();
}

 

5.17. Программирование события изменения активной ячейки в dataGridView1 (таблица Source)

Если изменить значение ячейки в таблице Source (элемент управления dataGridView1) с помощью мышки или клавиатуры, то должны выводиться соответствующие данные таблицы Emission (элемент управления dataGridView2).

В этом случае, эффективным есть программирование события CellEnter элемента управления dataGridView1. Это событие генерируется, если любая ячейка таблицы dataGridView1 получает фокус ввода. Такая ситуация возможная в случае, когда пользователь с помощью мышки или клавиатуры изменяет активные ячейки (строки).

Рис. 5.4. Событие CellEnter элемента управления dataGridView1

Обработчик события CellEnter имеет название dataGridView1_CellEnter(). Листинг обработчика события имеет вид:

// Изменение активной ячейки в dataGridView1
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    int n = dataGridView1.RowCount;
    int row = dataGridView1.CurrentRow.Index;
    if (n != (row + 1)) // Проверка, был ли клик на последней строке
        FillEmission();
}

 

6. Настройка команд меню menuStrip1

На этом шаге настраивается выполнение команд из меню menuStrip1 главной формы Form1 программы. Команды меню menuStrip1 копируют выполнение команд обработчиков событий кнопок button1, button2, …, button9. Поскольку, уже запрограммированы команды клика на кнопках главной формы, то достаточно перенаправить на них соответствующие команды меню.

Осуществим перенаправление команды меню «Источник» -> «Добавить …» на обработчик события button1_Click(). Для этого нужно выполнить следующие действия.

  1. Активировать команду «Источник»->»Добавить …» из меню menuStrip1 (рис. 6.1 — 1).
  2. Активировать вкладку Events в окне Properties (рис. 6.1 — 2).
  3. Выбрать событие Click (рис. 6.1 — 3).
  4. Из нисходящего списка выбрать название обработчика события button1_Click().

Рис. 6.1. Перенаправление команды «Источник»->»Добавить …» на обработчик события button1_Click()

По образцу настраиваются все другие команды меню:

  • команда «Источник» -> «Удалить» соответствует обработчику события button2_Click();
  • команда «Источник» -> «Редактировать …» соответствует обработчику события button3_Click();
  • команда «Выбросы» -> «Добавить …» соответствует обработчику события button4_Click();
  • команда «Выбросы» -> «Удалить» соответствует обработчику события button5_Click();
  • команда «Выбросы» -> «Редактировать…» соответствует обработчику события button6_Click();
  • команда «Расчет» -> «Минимальные выбросы…» соответствует обработчику события button7_Click();
  • команда «Расчет» -> «Максимальные выбросы…» соответствует обработчику события button8_Click();
  • команда «Расчет» -> «Средние выбросы…» соответствует обработчику события button9_Click().

 

7. Запуск программы на выполнение

После выполненных действий можно запускать программу на выполнение (рис. 7).

Рис. 7. Выполнение программы

 


Похожие темы