Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 11

МИНИСТЕРСТВО НА ОБРАЗОВАНИЕТО И НАУКАТА

ПРОФЕСИОНАЛНА ГИМНАЗИЯ “ГЕН. ВЛАДИМИР ЗАИМОВ” гр. СОПОТ


4330 гр. Сопот, ул. ”Иван Вазов” №1, тел./факс: /03134/ 83-31, 83-32, e-mail:pgzaimov@yahoo.com

ПРОЕКТ

НА ТЕМА:

„Създаване на Windows Form App за


зеленчукова борса с технологията ORM“

Изготвил: Десислава Цочева, 11 д клас, номер 9

Професия: „Приложен програмист“


Специалност: „Приложно програмиране“

1
СЪДЪРЖАНИЕ

1. Описание на базата данни……………………………...стр.3

1.1.Създаване на връзки между таблиците……………….стр.3

1.2.Описание на таблиците и релациите между тях…......стр.4

1.3.Създаване на компонентни таблици……….………....стр.5

1.4.Конфигуриране на база данни………………………..стр.5

1.5.Миграции………………………………………………стр.6

1.7.Създаване на база данни……………………………...стр.6

2.Функционално описание………………………………...стр.7

2.1. Функция за добавяне на нов запис…………………...стр.7

2.2. Функция за показване на всички записи…………….стр.8

2.3. Функция за търсене на запис по Id………….……….стр.8

2.4. Функция за промяна на запис………………………...стр.9

2.5. Функция за изтриване на запис…………….……….стр.10

2.6.Функция за изчистване на контролите……….……...стр.11

3.Заключение……………………………………………...стр.12

2
1.Описание на базата данни

Базата данни “VegetableContext” се състои от 2 таблици. Първата


таблица е Vegetables, в нея ще се въвежда основната информация за
зеленчуците, които ще се предлагат на зеленчуковата борса. Таблицата
има колона id, която служи за Primary Key. Посредством него, таблицата
се свързва с втората таблица “VegetableTypes”.

Втората таблица е за типовете на зеленчуците, тя е свързана с


първата таблица отново чрез колоната id. Тази колона се използва за
първичен ключ, защото важно условие е ключа да бъде колона с
уникални записи, които не се повтарят. “VegetableTypes” е свързана с
“Vegetables” чрез връзката М:1, защото 1 тип може да съвпада при
повече зеленчуци.

1.2. Създаване на връзки между таблиците

3
Фиг.1. E/R диаграма на базата данни „VegetableContext“

Връзките могат да бъдат 3 вида:

 Едно към едно (1:1)


 Едно към много (1:M)
 Много към много (N:M)

Таблицата “Vegetables” се свързва с “VegetableTypes” чрез връзката


1:М (едно към много), защото много зеленчуци могат да бъдат от един и
същи вид.

1.1.Описание на таблиците и релациите между тях


Технологията ORM (Object-Relatoinal Persistence Framework) ни дава
лесен и бърз достъп до базите данни. Позволява ни да описваме таблици
директно в средата за програмиране, под формата на класове. След това
с помощта на класовете можем да създадем базата данни заедно с
таблиците. В случая от класа „Vegetable“ ще се създаде таблица със
същото име и с колони, които ще приемат типовете и имената на
свойствата на класа.

За да създадем таблицата, с която се осъществява връзката, е нужно


свойство от типа на втората таблица („VegetableType“). По този начин
двете таблици ще имат създадена връзка от типа М:1.

public class Vegetable


{
public int Id { get; set; }
public int Number { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public double Price { get; set; }
//M:1
public int TypeId { get; set; }
public VegetableType Type { get; set; }
}

Фиг.2. Код за таблицата “Vegetables”

4
Класът ICollection е базовият интерфейс за класове в namespace от
имена System.Collections.Generic. Той предлага всички функционалности
нa IEnumerable и добавя няколко нови функционалности към
него. ICollection позволява да се добавят или премахват елементи в
колекцията, което не е възможно с IEnumerable.

public class VegetableType


{
public int Id { get; set; }
public int TypeId { get; set; }
public string Name { get; set; }
//1:M
public ICollection<Vegetable> Vegetables
{ get; set; }
}

Фиг.3. Код за таблицата “VegetableTypes”

1.2. Създаване на компонентни таблици


За да имаме достъп до всички инструменти за работа с бази от данни
трябва да наследим класа DbContext, който предизвиква инсталирането
на пакета EntityFramework. Този пакет ни осигурява възможност за
описание на таблици и релации, изпълнение на заявки, менажиране на
данни и тяхната сигурност.

public class VegetableContext:DbContext


{
public VegetableContext():base("VegetablesContext"){ }
public DbSet<Vegetable> Vegetables { get; set; }
public DbSet<VegetableType> VegetablesTypes {get;set;}
}

Фиг.4. Компонентна таблица „VegetableContext“

1.3. Конфигуриране на БД
<connectionStrings>
<add name="VegetableContext"
connectionString="Data Source=(localdb)\MSSQLLocalDB;
Initial Catalog=Greens; Integrated Security=true"

5
providerName="System.Data.SqlClient"
/>
</connectionStrings>
Фиг.5. Конфигуриране на БД

Във файла App.Config създаваме секция <conncetionString>, в която


добавяме низа за връзка. В този файл задаваме и името на базата данни.

1.4.Миграции
Изпълняват се последователно командите:

 PM>Enable-Migrations
 PM> Add-migration ИМЕ
 PM> Update-database

2. Създаване на БД
След като сме изпълнили последователно трите команди,
автоматично се генерира база данни с името от файла AppConfig и с
таблици по образец на класовете, които сме създали.

Това се случва с нова папка Migrations с име на класа, което също


сме задали в същия файл.

public override void Up()


{
CreateTable(
"dbo.Vegetables",
c => new
{Id = c.Int(nullable: false, identity: true),
Number = c.Int(nullable: false),
Name = c.String(),
Description = c.String(),
Price = c.Double(nullable: false),
TypeId = c.Int(nullable: false),})
.PrimaryKey(t => t.Id).ForeignKey("dbo.VegetableTypes",
t => t.TypeId, cascadeDelete: true)
.Index(t => t.TypeId);

CreateTable(
"dbo.VegetableTypes",
c => new
{ Id = c.Int(nullable: false, identity: true),
TypeId = c.Int(nullable: false),

6
Name = c.String(),
})
.PrimaryKey(t => t.Id);}

3.Функционално описание
Различните функции се осъществяват когато някой от бутоните на
приложението бъде натиснат.

Приложението реализира 6 вида функционалности:

 Add (Добавя)
 SelectAll (Извежда всички записи)
 Find (Търси запис по ид)
 Delete (Изтрива запис по ид)
 Update (Променя запис по ид)
 Clear (Изчиства контролите, за да са готови за ново ползване)

3.1. Функция за добавяне на нов запис


Функцията Add (добавяне) се реализира при натискането на бутона
“ADD”. Тогава започва да се проверява дали имаме въведена стойност в
контролата textbox за id и за име на продукта. Ако една от двете или и
двете текстови кутии са празни без зададени стойности за новия продукт,
тогава чрез MessageBox извеждаме съобщение на потребителя, че е
нужно да въведе данни за продукта. Чак когато са въведени, потребителя
получава съобщение, че неговият нов запис е успешно добавен в базата
данни.

private void btnAdd_Click(object sender, EventArgs e)


{
if (string.IsNullOrEmpty(txtName.Text) || txtName.Text == "")
{
MessageBox.Show("Въведете данни!");
txtName.Focus();
return;
}
Vegetable newVeg = new Vegetable();
newVeg.Number = int.Parse(txtNum.Text);
7
newVeg.Price = int.Parse(txtPrice.Text);
newVeg.Name = txtName.Text;
newVeg.TypeId = (int)comboBoxType.SelectedValue;
vegController.Create(newVeg);
MessageBox.Show("Добавен!");}
3.2. Функция за визуализиране на всички записи
Функцията All се реализира при натискането на бутона “SELECT
ALL”. Тогава в контролата “listBox” се визуализират всички записи,
извлечени от базата данни, по предварително зададения в кода ред и
начин.

private void btnAll_Click(object sender, EventArgs e)


{
List<Vegetable> allVeg = vegController.GetAll();
listBoxAll.Items.Clear();
foreach (var item in allVeg)
{
listBoxAll.Items.Add($"{item.Id}. {item.Number}- {item.Name}-
{item.Price} $");
}
}

3.3. Функция за търсене на запис по Id

Функцията за търсене (“Find”) се осъществява при натискането на


бутона “FIND”. Той търси съвпадение между id, въведено от потребителя
в текстовото поле и id на някой от записите в таблицата. Ако текстовото
поле е празно, се извежда съобщение да се въведе Id. Ако не бъде
намерено съвпадение, се извежда съобщение, че id не съществува в
таблицата. В противен случай, на различните контроли се показват
данните, извлечени от таблицата с помощта на метода Get(), който
предварително сме създали при писането на логиката за приложението.

private void btnFind_Click(object sender, EventArgs e)


{
int findId = 0;
if (string.IsNullOrEmpty(txtId.Text))
{
MessageBox.Show("Въведи ид!");
txtId.BackColor = Color.Red;
txtId.Focus();
return;

8
}
else
{
findId = int.Parse(txtId.Text);

}
Vegetable findVeg = vegController.Get(findId);
comboBoxType.Text = typeController.GetTypeById(findId);
if (findVeg == null)
{
MessageBox.Show("Не е намерено такова ид!");
txtId.BackColor = Color.Red;
txtId.Focus();
return;
}
LoadRecord(findVeg);
ClearScreen();
}

3.4. Функция за промяна на запис


Функцията Update се реализира при натискането на бутона
“UPDATE”. Тя работи по аналогичен начин на функцията Find. Отново
изпълнява същите функционалности при празно поле или при невалидно
id. Ако намери съвпадение с id от таблицата се създава нов обект от типа
Vegetable, който приема данните, въведени от потребителя в контролите.

private void btnUpdate_Click(object sender, EventArgs e)


{
int findId = 0;
if (string.IsNullOrEmpty(txtId.Text))
{
MessageBox.Show("Въведете ид!!!");
return;
}
else
{
findId = int.Parse(txtId.Text);

}
Vegetable findVeg = vegController.Get(findId);
findVeg.Id = int.Parse(txtId.Text);
findVeg.Name = txtName.Text;
findVeg.Number = int.Parse(txtNum.Text);
findVeg.Price = int.Parse(txtPrice.Text);
MessageBox.Show("Всичко е готово!");
}
9
3.5. Функция за изтриване на запис

Функцията Delete се реализира при натискане на бутона “DELETE”.


Тя също както Update и Find търси съвпадение с id. Ако намери
съвпадение, се извежда съобщение, което пита потребителя дали
наистина иска да изтрие записа. При отговор „YES“ записът се премахва
от таблицата, при „NO“ се запазва и потребителя подновява работата си
с приложението.

private void btnDelete_Click(object sender, EventArgs e)


{
int findId = 0;
if (string.IsNullOrEmpty(txtId.Text))
{
MessageBox.Show("Въведи ид!");
txtId.BackColor = Color.Red;
txtId.Focus();
return;
}
else
{
findId = int.Parse(txtId.Text);
}

if (string.IsNullOrEmpty(txtName.Text))
{
Vegetable findVeg = vegController.Get(findId);
if (findVeg == null)
{
MessageBox.Show("Не е намерено такова ид.");
txtId.BackColor = Color.Red;
txtId.Focus();
return;
}
LoadRecord(findVeg);
}
DialogResult answear = MessageBox.Show("Искате ли да изтриете записа?",
"Question", MessageBoxButtons.YesNo);
if (answear == DialogResult.Yes)
{
vegController.Delete(findId);
MessageBox.Show("Успешно изтрихте записа.");
}
}

10
3.6. Функция за изчистване на контролите
Функцията Clear се осъществява при натискането на бутона CLEAR.
Тя връща контролите в начално положение без въведените от
потребителя данни, за да не се налага да се изтриват всеки път от
потребителя.

private void btnClear_Click(object sender, EventArgs e)


{
txtNum.Clear();
txtName.Clear();
txtPrice.Clear();
comboBoxType.Text = "";
}

4. Заключение

Windows Forms Application е технология за създаване на десктоп


приложения в Microsoft Windows операционната система. С помощта на
ORM технологията, лесно могат да се свърже приложението с база от
данни, като се използват обекти вместо SQL заявки. Това прави работата
по манипулирането на данните по-лесна и ефективна.

В заключение, използването на Windows Forms Application и ORM


технология може да улесни работата ни при създаването на десктоп
приложения или уеб сайтове, които работят с бази от данни.

11

You might also like