Базы данных. Как я делал проект на C#

На личном опыте о том, как проходит второе знакомство с С#
19 ноября 2015326451Илья Бубнов476521017

Предыстория

Буквально пару недель назад мой начальник обратился ко мне с просьбой - создать простое приложение на 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».