диплом (1229326), страница 4
Текст из файла (страница 4)
Для редактирования информации об устройстве, необходимо дважды нажать левую кнопку мыши по номеру устройства в главной форме. Форма редактирования данных об устройстве изображена на рисунке 26.
Рисунок 26 – Форма редактирования информации об устройстве
Справочник сотрудников состоит из двух блоков. В первом блоке содержится информация о сотруднике. Во втором блоке содержится информация о закрепленном оборудовании за выбранным сотрудником.
Справочник сотрудников изображен на рисунке 27.
Рисунок 27 – Справочник сотрудников
4.3 Реализация функционала программного комплекса
Для хранения настроек базы данных используется объект Properties.Settings, встроенный в Microsoft Visual Studio [12-19].
Было создано 4 объекта:
-
Server – хранит адрес базы данных;
-
UserName – хранит логин пользователя;
-
Password – хранит пароль пользователя;
-
BaseName – хранит имя базы данных.
Ввод данных и их сохранение используется в форме подключения к базе данных.
Листинг 1. Сохранение введенных в форме подключения данных в файл конфигурации
private void SaveToDBReg_Click(object sender, EventArgs e)
{
Properties.Settings.Default.Server = ServerToDBReg.Text;
Properties.Settings.Default.UserName = UserNameToDBReg.Text;
Properties.Settings.Default.Password = PasswordToDBReg.Text;
Properties.Settings.Default.BaseName = DBName.Text;
Properties.Settings.Default.Save();
}
}
Подключение к базе данных с использованием языка C#, осуществляется с помощью строки подключения: server=адрес сервера; uid=логин;pwd=пароль; database=имя базы;" [11].
Данная строка используется в базовом классе DBConnection, в функции инициализации. Класс включает в себя:
-
функцию InitializeDB – необходима для объявления параметров подключения к базе данных и его инициализации.
-
функцию OnConnection – осуществляет подключение к базе, а также обрабатывает исключение, которые могут произойти в результате сбоев. Данная функция возвращает значение true, если произошло подключение, и значение false, в случае сбоя.
-
функцию CloseConnection – осуществляет отключение от базы. Возвращает значение true.
Листинг 2. Функция инициализации
protected void InitializeDB()
{
var defaultSettings = Properties.Settings.Default;
connect = string.Format("server={0};uid={1};pwd={2};database={3};", defaultSettings.Server, defaultSettings.UserName, defaultSettings.Password, defaultSettings.BaseName);
MySqlConnection conn = new MySqlConnection(connect);
}
Листинг 3. Функция подключения к базе данных
protected bool OnConnection()
{
try
{
conn.Open();
return true;
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 0:
int num1 = (int)MessageBox.Show("Отсутствует подключение к серверу.");
break;
case 1045:
int num2 = (int)MessageBox.Show("Неверный логин или пароль");
break;
}
return false;
}
}
Ниже представлены листинги кода отдельный операций, которые выполняются при работе с главной формой.
Для получения списка категорий из базы данных и их отображения в главной форме используется функция GetCat, этап работы функции рассмотрен ниже:
-
перед началом работы дерево записей, содержащий список категории, очищается;
-
производится проверка на возможность подключиться к базе данных, в случае если проверка удачна, происходит подключение к базе;
-
выполняет SQL- запрос, на получение данных из таблицы category;
-
создается новый экземпляра класса DataSet обеспечивающие хранение данных, полученных из базы MySQL, и выполняет функцию кэша;
-
заполняется только что созданный экземпляр класса DataSet данными из таблицы category;
-
производится перечисление всех строк таблицы category в кэше DataSet;
-
создается новый экземпляр узла объекта treeView;
-
заполняются пустые поля id, name, isLock данными, которые были получены из перечисленных объектов;
-
добавляется новый объект категории из полученных данных в узел;
-
закрывается подключение к базе данных.
Листинг 4. Получение категорий из базы данных и отображения в главной форме
void GetCat()
{
// Очищение списка категорий на главной форме
treeView1.Nodes.Clear();
if (OnConnection())
{
string qeury = "select *from category";
MySqlDataAdapter mda = new MySqlDataAdapter(qeury, conn);
/* Создание нового экземпляра для хранения данных полученные из базы данных в кэше */
DataSet ds = new DataSet();
// Заполнение кэша данными из таблицы category
mda.Fill(ds, "category");
// Перечисление данных в созданном кэше
foreach (DataRow dr in ds.Tables["category"].Rows)
{
// Создание нового экземпляр узла объекта treeView
TreeNode tn = new TreeNode();
/* Заполнение полей из полученных данных, для последующего добавления в узел */
string id = dr["catID"].ToString();
string name = dr["cat_name"].ToString();
bool isLock = Convert.ToBoolean(dr["cantDelete"].ToString());
tn.Text = name;
tn.Tag = id;
treeView1.Nodes.Add(tn);
// Добавление нового значения в узел, объекта treeView
catInfo[id] = isLock;
}
CloseConnection();
}
}
Процесс создания категории состоит из нескольких функций, обеспечивающих выполнение следующих этапов:
-
создание нового пустого объекта, типа string;
-
добавление только что созданного объекта в узел;
-
установление метки, разрешающей редактировать текст в выбранном узле;
-
проверка активации режима редактирования;
-
после окончания редактирования выполнение проверки того, что текст в данном узле не пустой. В случае, если в узле отсутствует текст, то узел удаляется;
-
выполнение функции на обновления информации в базе данных. Выполнение проверки: если узел, который отредактирован, уже существовал и содержал запись, то в базу данных отправляется SQL-запрос на обновление названия категории. Если узел, только создан, тогда в базу данных отправляется SQL-запрос на создание новой записи.
Листинг 5. Создания новой категории
void CreateCat()
{
// Создание пустого поля типа string
string empty = "";
// Добавление его в узел
treeView1.Nodes.Add(empty);
// Выбор данного узла
treeView1.SelectedNode = treeView1.Nodes[treeView1.Nodes.Count - 1];
NodeRename();
}
void NodeRename()
{
var selectNode = treeView1.SelectedNode;
/* Устанавливается метка, разрешающая редактировать текст и выполняется проверка активации редактирования */
treeView1.LabelEdit = true;
if (!selectNode.IsEditing)
selectNode.BeginEdit();
}
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
if (e.Label == null && !string.IsNullOrEmpty(treeView1.SelectedNode.Text)) { isNew = false; return; }
if (string.IsNullOrEmpty(e.Label))
{
e.CancelEdit = true;
isNew = false;
treeView1.Nodes.Remove(treeView1.SelectedNode);
}
else
{
e.Node.EndEdit(true);
e.Node.Text = e.Label;
treeView1.LabelEdit = false;
NodeNameUpdate();
}
}
После создания новой категории в приложении информация о ней передается в базу данных и список категорий обновляется в приложении для дальнейшей корректной работы.
Листинг 6. Обновление данных о категориях
void NodeNameUpdate()
{
if (OnConnection())
{
// Создание SQL-запрос на обновление категории по заданному имение или id
string qeury = string.Empty;
if (isNew)
qeury = "INSERT INTO category (cat_name) VALUES(@catName)";
else
qeury = "UPDATE category SET cat_name=@catName WHERE catID=@id";
MySqlDataAdapter mda = new MySqlDataAdapter(qeury, conn);
// Подстановка значений в SQL-запрос из полей
mda.SelectCommand.Parameters.AddWithValue("@catName", treeView1.SelectedNode.Text);
mda.SelectCommand.Parameters.AddWithValue("@id", treeView1.SelectedNode.Tag);
// Выполнение SQL-запроса и закрытие подключения к базе данных
mda.SelectCommand.ExecuteNonQuery();
CloseConnection();
}
isNew = false;
// Создание таймера для обновления списка категорий в приложение
timer = new Timer();
timer.Interval = 500;
timer.Tick += delegate (Object o, EventArgs e)
{ GetCat(); timer.Stop(); };
timer.Start();
}
Заполнение данных об устройстве, происходит после выбора категории.
Листинг 7. Обновление данных об устройстве в выбранной категории
public void UpdateTable()
{
if (OnConnection())
{
/* Создание SQL-запроса на обновление информации об оборудование от заданной категории */
string qeury = string.Format("select id, brand, model, work_nubmer, member,member_directory_id, cur_status from equipment join member_directory,status where category_id = {0} and member_directory_id = memberID and status_id = statusID", treeView1.SelectedNode.Tag);
Dictionary<string, string> dataSet = new Dictionary<string, string>();
MySqlDataAdapter mda = new MySqlDataAdapter(qeury, conn);
MySqlCommandBuilder cmd = new MySqlCommandBuilder(mda);
/* Создание нового экземпляра для хранения данных полученные из базы данных в кэше */
DataSet ds = new DataSet();
/* Заполнение кэша данными из SQL-запроса и установка наименований полей в таблице */
mda.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
dataGridView1.Columns[0].Visible = false;
dataGridView1.Columns[5].Visible = false;
dataGridView1.Columns[1].HeaderText = "Бренд";
dataGridView1.Columns[2].HeaderText = "Модель";
dataGridView1.Columns[3].HeaderText = "Инвентарный номер";
dataGridView1.Columns[4].HeaderText = "Сотрудник";
dataGridView1.Columns[6].HeaderText = "Статус";
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
CloseConnection();
}
}
Для добавления оборудования используется класс AddComponents, который наследуется от базового класса DBConnection. Класс выполняет проверки на отсутствия пустых полей и дубликатов серийного номера, а также включает в себя следующие функции:
-
GetName – получает список брэндов оборудования из базы данных от выбранной категории и добавляет их в коллекцию строк, для отображения списка при заполнения текстового поля пользователем. Листинг приведен в приложение Б (1);
-
GetModel – получает список моделей оборудования с заданного бренда пользователем в текстовом поле и добавляет их в коллекцию строк, для отображения списка при заполнения текстового поля пользователем. Листинг приведен в приложение Б (2);
-
GetMemberFullInfo – получает информацию о сотрудниках и выполняет аналогичные действия приведенных функций выше. Листинг приведен в приложение Б (3);
-
GetSN – получает список серийных номеров оборудования и выполняет аналогичные действия приведенных функций выше.
-
GetWN – получает список инвентарных номеров оборудования и выполняет аналогичные действия приведенных функций выше.
-
AddEquipment – выполняет SQL-запрос на добавление новой информации в базу данных. Листинг приведен в приложение Б (4).
Для редактирования информации об оборудование используется класс FullInfo. Данный класс включает функции:
-
GetFullInfo – выполняет SQL-запрос на получение полной информации выбранного оборудования и заполняет поля данными. Листинг приведен в приложение В (1);
-
Обработчики событий OnClick – отправляют SQL-запрос на обновление информации о текущем статусе и инвентарном номере. Листинг приведен в приложение B (2).
Для справочника сотрудников используется форма с классом MemberManager. Данная форма отображает список сотрудников и закрепленную компьютерную технику за выбранным сотрудником, а также кнопки для управления информации о сотрудниках (добавление, редактирование, удаление, назначение по умолчанию). Класс наследуется от базового класса DBConnection и содержит следующие функции:
-
GetMember - выполняет SQL-запрос на получение списка сотрудников и заполняет им таблицу. Листинг приведен в приложение Г (1);
-
GetEquipment - выполняет SQL-запрос на получение списка закрепленной техники за выбранным сотрудником и заполняет им таблицу оборудования. Листинг приведен в приложение Г (2).
Для добавления сотрудника используется класс AddMember. Данный класс включает в себя проверку на сотрудника по умолчанию и регулярное выражение на проверку веденного телефонного номера, а также обработчик событий на нажатие кнопки.