
- •Основи програмної інженерії Тема 1. Поняття програмної інженерії. Вступ
- •Процес створення програмного забезпечення
- •Моделі технологічного процесу створення пз
- •Моделі процесу розробки по
- •Характеристики якісного пз
- •Тема 2. Види моделей систем. Поняття і класифікація вимог до програмної системи.
- •Способи запису специфікацій вимог.
- •Види моделей систем.
- •Мова моделювання uml.
- •Об'єктні моделі
- •Інструментальні case-засоби.
- •Тема 3. Поняття архітектурного проектування. Архітектурні моделі.
- •Архітектурний шаблон mvc.
- •Особливості шаблону mvc.
- •Модель проблемної сфери.
- •Тема 4. Важливі функціональні засоби мови c#. Автоматично реалізовані властивості.
- •Ініціалізатори об'єктів та колекцій.
- •Автоматичне виведення типу.
- •Анонімні типи.
- •Використання методів розширення Методи розширення
- •Застосування методів розширення до інтерфейсу
- •Створення фільтруючих методів розширення
- •Тема 5. Лямбда-вирази. Мова linq. Лямбда-вирази.
- •Мова linq.
- •Методи розширення linq.
- •Відкладені запити linq.
- •Тема 6. Створення слабо зв'язаних компонентів. Впровадження залежності.
- •Контейнери впровадження залежності.
- •Бібліотека Ninject.
- •Порядок роботи з Ninject.
- •Тема 7. Засоби доступу до даних. Технологія ado.Net.
- •Реалізація доступу до даних.
- •Робота з даними.
- •Тема 8. Тестування пз. Розробка через тестування. Автоматизоване тестування пз та його види.
- •Розробка через тестування. Робочий потік "червоний-зелений-рефакторинг".
- •Модель "організація.Дія.Твердження".
- •Використання бібліотеки Moq
- •Тема 9. Проектування інтерфейсу користувача. Інтерфейс користувача.
- •Переваги графічного інтерфейсу.
- •Процес проектування графічного інтерфейсу.
- •Принципи проектування інтерфейсів користувача.
- •Шаблони.
- •Тема 10. Основи інженерії вимог. Розробка вимог.
- •Формування і аналіз вимог.
- •Опорні точки зору.
- •Сценарії.
- •Атестація вимог.
- •Тема 11. Прототипування програмних систем. Поняття прототипування.
- •Переваги прототипування.
- •Види прототипування.
- •Технології швидкого прототипування.
- •Тема 12. Покомпонентна розробка. Компоненти і класи об'єктів.
- •Компоненти як постачальники послуг.
- •Рівні абстракції компонентів.
- •Вимоги до компонентів.
- •Тема 13. Шаблони проектування. Структурні шаблони.
- •Поняття шаблону проектування.
- •Основні елементи шаблону.
- •Механізми повторного використання.
- •Структурні шаблони проектування.
Робота з даними.
Тип DataTable
Клас DataTable використовується для створення в оперативній пам'яті моделей табличних наборів даних.
Основні властивості класу DataTable:
CaseSensitive – визначає, чи буде при порівнянні символьних даних у таблиці враховуватися регістр символів. За замовчуванням – false (не буде)
Child Relations – повертає колекцію підлеглих відношень ( DataRelatioriCoilertion ) для об'єкта DataTable (якщо такі є)
Columns – повертає набір стовпців для таблиці
Constraints – дозволяє отримати колекцію обмежень , визначених у таблиці ( ConstraintCollection )
DataSet – дозволяє отримати посилання на об'єкт DataSet, до якого належить дана таблиця (якщо такий об'єкт є)
DefaultView – Дозволяє отримати налаштоване представлення для таблиці, яке може включати в себе, наприклад, тільки деякі вибрані користувачем стовпчики чи дані про положення курсору
MinimumCapacity – дозволяє отримати або встановити вихіднe кількість рядків у таблиці (за замовчуванням використовується значення 25 )
ParentRelations – дозволяє отримати колекцію батьківських відношень для даного об'єкта DataTable
PrimaryKey – дозволяє отримати або встановити масив стовпців, які є первинним ключем в таблиці
Rows – повертає набір рядків , що відносяться до таблиці
TableName – дозволяє отримати ім'я таблиці або визначити його. Значення для цієї властивості може бути встановлено через конструктор таблиці.
Створимо об’єкт DataTable для збереження списку вузлів графа у базі даних:
DataTable dt = new DataTable("Node");
В таблиці потрібно створити 4 стовпця: NodeID, Name, X, Y.
Для реалізації стовпців таблиць використовуються об’єкти класу DataColumn.
Тип DataColumn
Тип DataColumn представляє окремий стовпець у таблиці (яка, в свою чергу, повинна бути представлена об'єктом DataTablе).
Основні властивості класу DataColumn:
AllowDbNull – використовується з метою визначення того, чи може стовпець містити значення NULL (порожні значення) За замовчуванням – може ( значення цієї властивості рівне true)
AutoIncrement, AutoIncrementSeed, AutoIncrementStep – ці властивості використовуються для налаштування автоматичного збільшення значень у стовпці. Це може бути корисно, якщо необхідно забезпечити унікальність значень в стовпці (наприклад, для первинного ключа). За замовчуванням автоматичний приріст значень у стовпцях відключено
Caption – визначає заголовок стовпця для відображення в призначеному для користувача додатку ( наприклад , цей заголовок може бути використаний в DataGrid )
ColumnMapping – визначає , як буде представлений стовпець (об'єкт DataColumn) при збереженні DataSet у форматі XML (шляхом виклику методу DataSet.WriteXml)
ColumnName – дозволяє отримати або встановити ім'я стовпця в колекції Columns (внутрішня колекція для стовпців в DataTable). Якщо ім'я стовпця не визначено явно, то будуть використані значення за замовчуванням: Columnl, Column2, Column3 і т. д.
DataType – визначає тип даних (boolean , string , float і т. п. ), що використовується для значень в стовпці
DefaultValue – дозволяє встановити або отримати значення за замовчуванням для стовпця. Це значення буде автоматично використано , якщо при вставці нового рядка не задати явно інше значення
Expression – дозволяє отримати або встановити вираз, що використовується для фільтрації нових рядків, обчислення значення в стовпці або створення стовпців з агрегатними значеннями
Ordinal – дозволяє встановити порядковий номер стовпчика в колекції Columns у DataTable
ReadOnly – визначає, чи буде стовпець тільки для читання (якщо так, то значення в цьому стовпці після додавання рядка змінювати вже буде неможливо). За замовчуванням має значення faise
Table – повертає об'єкт DataTable, якому належить даний об'єкт DataColumn
Unique – дозволяє визначити, чи будуть у стовпці допускатися повторювані значення. Якщо стовпець є первинним ключем, то ця властивість повинна мати значення true
Приклад створення стовпців для таблиці Node:
DataColumn dc;
dc = new DataColumn("NodeID", typeof(uint));
dc.AllowDBNull = false;
dc.Unique = true;
dt.Columns.Add(dc);
dc = new DataColumn("Name", typeof(string));
dc.AllowDBNull = false;
dc.Unique = true;
dt.Columns.Add(dc);
dc = new DataColumn("X", typeof(int));
dt.Columns.Add(dc);
dc = new DataColumn("Y", typeof(int));
dt.Columns.Add(dc);
Налаштування представлення стовпця в форматі XML
Властивість ColumnMapping об’єкта DataColumn визначає, як даний стовпець буде представлений в форматі XML при витяганні вмісту стовпця за допомогою методу WriteXml. Для властивості ColumnMapping використовуються значення з перерахування MappingType:
Attribute – стовпцю відповідає атрибут XML
Element – стовпцю відповідають елемент XML (значення за замовчанням)
Hidden – стовпцю відповідає внутрішня структура
TableElement – стовпцю відповідає значення таблиці
Text – стовпцю відповідає значення тексту
При використанні значення Element стовпцю NodeID в текстовому файлі будуть відповідати значення виду:
<Node>
<NodeID>1</NodeID>
</Node>
При використанні значення Attribute:
<Node NodeID = “1” />
Тип DataRow
Колекція об'єктів DataRow об’єкту DataTable визначає дані, що зберігаються в таблиці. Кожен запис в таблиці представлений окремим об'єктом DataRow . За допомогою членів класу DataRow ми можемо виконувати операції вставки, зміни та видалення рядків з таблиці, а також порівнювати значення , що містяться в рядках.
Клас DataRow визначає індексатор, за допомогою якого можна отримати значення з поля рядка за порядковим номером. Звичайно ж, те ж саме значення можна отримати і по імені стовпця.
Члени класу DataRow:
AcceptChanges(), RejectChanges() – для запису в рядок (або відмови від них ) всіх змін, зроблених починаючи з моменту , коли останній раз був викликаний метод AcceptChanges()
BeginEdit(), EndEdit(), CancelEdit() – почати , завершити . припинити операції редагування для об'єкта DataRow
Delete() – позначає рядок для видалення при наступному виклику методу AcceptChanges()
HasErrors, GetColumnsInErrors(), GetColumnError(), ClearErrors(), RowError – властивість HasErrors повертає логічне значення, що визначає , чи є помилки у значеннях стовпців для цього рядка. Якщо такі помилки є то для отримання значень, які порушують встановлені правила, можна використовувати метод GetColumnsInError(). Для отримання опису помилки можна використовувати GetColumnError(), a ClearErrors() просто видаляє всі помилкові значення з рядка. Властивість RowError дозволяє налаштувати текстовий опис для помилки в стовпці
IsNull() – повертає інформацію про те , чи містить рядок у вказаному полі порожнє значення (значення типу NULL)
ItemArray – дозволяє отримати або встановити значення всіх полів рядка за допомогою масиву об'єктів
RowState – дозволяє отримувати інформацію про стан об'єкта DataRow. Використовуються значення з перерахування RowState
Table –використовується для отримання покажчика на таблицю, що містить поточний об'єкт DataRow
Значення перерахування DataRowState:
Deleted – рядок було змінено за допомогою методу DataRow.Delete()
Detached – рядок було створено, але він ще не є частиною DataRowCollection. Зазвичай рядок знаходиться в такому стані безпосередньо після вставки або після примусового виведення із колекції DataRowCollection
Modified – рядок було змінено, але метод AcceptChanges() ще не викликався
New – рядок було додано у колекцію але метод AcceptChanges() ще не був викликаний
Unchanged – рядок не був зміненим з моменту останнього виклику методу AcceptChanges()
Більшість методів і властивостей класу DataRow використовується тільки в контексті розміщення об'єкта DataRow у таблиці (DataTable).
Приклад додання рядків у таблицю Nodes:
if(graph.Nodes != null)
foreach (KeyValuePair<uint, Node> pair in graph.Nodes)
{
DataRow dr = dt.NewRow();
dr["NodeID"] = pair.Value.ID;
dr["Name"] = pair.Value.Name;
dr["X"] = pair.Value.X;
dr["Y"] = pair.Value.Y;
dt.Rows.Add(dr);
}
Можливості класу DataSet
Уміння створювати таблиці з даними (об'єкти DataTable) в оперативній пам'яті і виконувати з ними всі необхідні операції може бути цілком достатньо для багатьох додатків. Однак набагато частіше таблиці в базах даних використовуються не самі по собі, а у взаємодії дії з іншими таблицями. У ADO.NET можливості роботи з наборами таблиць, взаємозалежних одна від одної, надає клас DataSet. Усі інтерфейси для доступу до даних в ADO.NET повертають саме об'єкт DataSet (як набір взаємозв'язаних об'єктів DataTablе).
Об'єкт DataSet – це набір таблиць (об'єктів DataTablе), зв'язаних між собою відношеннями і забезпечених засобами перевірки цілісності даних (для них в DataSet передбачені свої об'єкти), що створюється у оперативній пам'яті.
Доступ до внутрішніх колекцій DataTableCol1ection, DataRelationCollection та PropertyCollection об’єкту DataSet здійснюється через властивості Tables, Relations і ExtendedProperties відповідно.
Властивість ExtendedProperties забезпечує доступ до об'єктів, що зберігаються в колекції PropertyCollection. Основне їх призначення – забезпечити можливість асоціювати додаткову інформацію (у вигляді пар ім'я-значення ) з об'єктом DataSet. В принципі цією додатковою інформацією може бути все, що завгодно. Наприклад , ми можемо самостійно визначити, що у нашого об'єкта DataSet буде властивість CompanyName, а як значення цієї властивості вказати ім'я нашої компанії. Виглядати це буде так :
DataSet ds = new DataSet ( " MyDataSet " );
ds.ExtendedProperties.Add ( "CompanyName", "InterTech. Inc" );
Console.WriteLine ( ds.ExtendedProperties ["CompanyNanie"].ToString() ) :
Ми можемо використовувати розширені властивості для зберігання самої різної інформації: наприклад, про внутрішній паролі для доступу до даних , про інтервал синхронізації даних і т. п. Крім тог , розширені властивості (тобто властивість ExtendedProperties) передбачені не тільки для DataSet, але й для DataTable.
Приклад створення об’єкту DataSet для графа:
DataSet ds = new DataSet("Graph " + graph.Name);
ds.Tables.Add(CreateNodeTable(graph));
ds.Tables.Add(CreateLinkTable(graph));
ds.Tables.Add(CreateGraphTable(graph));