Базы данных. Как я делал проект на C#
Предыстория
Буквально пару недель назад мой начальник обратился ко мне с просьбой - создать простое приложение на C# для регистрации задач и проектов сотрудников нашего отдела. Ничего сложного, стандартная форма с текстовыми полями и кнопками, по заполнению которых в некоторый файл на сервере добавляется строка с введёнными данными. Дополнительное приложение позволяет контролирующему органу извлекать из файла эту информацию, фильтровать и использовать в дальнейшем планировании. Казалось бы, что может быть проще. В этой истории лишь одна загвоздка. Я никогда не работал на C#.
Нет, безусловно, как и у любого «высокообразованного технаря», в университете у меня были курсы по программированию, где обучали в том числе и вышеобозначенному языку. Кстати, данный факт в резюме и привёл моего начальника со своей просьбой. Что ж, делать нечего, отбросив страх и лень, пришлось взяться за дело. Если вы никогда не кодили на C#, приглашаем вас пройти наш бесплатный интенсив по C# для новичков.
Берёмся за дело
Прежде всего, необходим бесплатный дистрибутив. Приложение нам необходимо для личного пользования, поэтому можно смело идти на официальный сайт Visual Studio Community и запускать процесс скачивания. Почему именно VS, а не более простое решение? Если вкратце, то это большие возможности по развитию, графическому и программному. Пока идёт долгий процесс скачивания и установки, освежаем знания. Основы C# или VS здесь описываться не будут. Просто допустим, что любой человек хоть немного изучавший программирование, прекрасно знает циклы, функции и операторы. Со структурой среды программирования можно разобраться просто скачав один из примеров на сайте разработчика и внимательно его изучив.
Мой же краткий план таков – на первом этапе пишем приложение, которое создаёт базу данных сотрудников и записывает её в формат XML. На втором этапе позаботимся о начальниках, подумав об извлечении информации с использованием различных фильтров. Чтобы немного усложнить конечную задачу, я решил поэкспериментировать с различными подходами – работа с БД напрямую и через коллекции.
В остальном, задача предельно ясна, поэтому можно приступать. Создадим пустой XML файл с требуемой структурой с использованием обыкновенного блокнота:
<?xml version="1.0"?> <employees> <employee> <id>0</id> // порядковый номер задачи <department> </ department> // отдел <position> </position> // должность <name> </name> // имя <project> </project> // проект <task ></task> // задача <date> </date> // дата </employee> </employees>
Заходим непосредственно в Visual Studio и приступаем к самому простому и приятному – созданию нашей формы:
Далее прямо в инициализации формы создадим объекты директории, файла и данных:
private string myDirectory = string.Empty; // инициализируем директорию private XmlDocument MyDoc = null; // нашу БД DataTable Emptable = null; // таблицу с данными DataSet Employees = null; // данные
Далее привяжем наш XML файл к проекту и загрузим из него данные:
myDirectory = Directory.GetCurrentDirectory(); //присваиваем значение текущей директории using (StreamReader streamreader = new StreamReader(myDirectory + @"\employees.xml", System.Text.Encoding.UTF8)) { Employees = new DataSet(); Employees.ReadXml(streamreader, XmlReadMode.Auto); Emptable = Employees.Tables[0]; // присваиваем данные БД нашей таблицы }
Осталось мелочь – по нажатию кнопки ОК организовать проверку заполнения полей и сохранение данных в созданный файл:
private void button1_Click(object sender, EventArgs e) // поочерёдно проверяем заполненность полей { if (textBox1.Text == "") return; if (textBox2.Text == "") return; if (textBox3.Text == "") return; if (textBox4.Text == "") return; if (textBox5.Text == "") return;
Найдём максимальный ID в нашей таблице, чтобы создать следующий элемент:
DataRow[] datarows = null; // создаём отдельную строку string s = string.Empty; // пустую строку try // находим старший индекс по последней заполненной строке { datarows = Emptable.Select("id=max(id)"); s = datarows[0]["id"].ToString(); } catch (Exception) { } if (s == "" || s == string.Empty) // если строки пустые, индекс - 0 { s = "0"; }
Создаем новую строку для нашей таблицы:
DataRow datarow = Employees.Tables[0].NewRow();
И добавляем в неё полученные данные:
datarow[0] = Convert.ToString(i); // комментарии излишни datarow[1] = textBox1.Text.Trim(); datarow[2] = textBox2.Text.Trim(); datarow[3] = textBox3.Text.Trim(); datarow[4] = textBox4.Text.Trim(); datarow[5] = textBox5.Text.Trim();
Для организации таблицы, извлечём системное время:
DateTime date1 = DateTime.Now; // текущее время datarow[6] = date1.ToString("G"); // конвертируем в строку Employees.Tables[0].Rows.Add(datarow); // добавляем в таблицу
Очистим строки:
textBox1.Text=""; textBox2.Text=""; textBox3.Text=""; textBox4.Text=""; textBox5.Text="";
Вот, кажется, и всё. Сохраняем данные и перезагружаем файл:
Employees.WriteXml(myDirectory + @"\employees.xml",XmlWriteMode.WriteSchema); Employees = new DataSet(); Employees.ReadXml(myDirectory + @"\ employees.xml",XmlReadMode.Auto); Emptable = Employees.Tables[0];
Переходим ко второму этапу. Создаём форму с фильтрами, где поочерёдно структура таблицы будет представлена в формате ListBox-ов. Форма выглядит следующим образом:
Переходим к созданию нашего списка внутри программы. Создаём класс и инициализируем его:
public class Employee { public string EmployeeID { get; set; } public string DepartmentName { get; set; } public string ePosition { get; set; } public string EmployeeName { get; set; } public string ProjectName { get; set; } public string PostalCode { get; set; } public string TaskName { get; set; } }
Загружаем данные внутрь программных данных:
public List<Employee> GetTaskList() // Проверка на пустые данные и загрузка { if (EmployeeList == null) createList(); return EmployeeList; } private void createList() // инициализация формата таблицы данных { EmployeeList = ( from e in XDocument.Load("employees.xml"). // загружаем таблицу Root.Elements("employee") select new Employee // записываем столбцы в память { EmployeeID = (string)e.Element("id"), DepartmentName = (string)e.Element("department"), ePosition = (string)e.Element("position"), EmployeeName = (string)e.Element("name"), ProjectName = (string)e.Element("project"), TaskName = (string)e.Element("task"), }) .ToList(); }
Теперь переходим непосредственно к фильтрам. Первый столбец (номинально второй) загружаем полностью.
List<Employee> ourtasks = GetTaskList(); n = outasks.Count; foreach (var adddep in ourtasks) { ListBox1.Items.Add(adddep.DepartmentName); // загружаем, пока не закончатся строки }
После чего переходим к фильтрации при обработке изменения выбранного в ListBox:
var Tsks = // запускаем шаблон обработки данных linq. Внимание: работает только с версии 2008 года from myjob in OurTasks where myjob.DepartmentName == ListBox1.SelectedItem.ToString(); select myjob; foreach (var addPos in Tsks) { ListBox2.Items.Add(addPos.Position); }
Послесловие
И далее по аналогии до бесконечности, пока последний запрос не выведет необходимые руководителю поля.
После некоторых доработок и отладок результат был достигнут, а торжественное «Спасибо» - произнесено. Злой рок судьбы теперь каждое утро сталкивает меня и моих коллег с первой частью результатов моего труда и постепенно наводит на размышление, которое я адресую дорогому читателю - а можно ли было сделать лучше и, что самое главное, проще?
Кстати, освоить разработку под Windows можно, обучаясь на профессии «Программист Windows».