Базы данных. Как я делал проект на 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».
