Архітектура та проектування компонентних систем

Содержание

Слайд 2

ODBC API (Open Database Connectivity);
RDO (Remote Data Objects);
DAO (Data Access Objects);
OLE DB;
ADO

ODBC API (Open Database Connectivity); RDO (Remote Data Objects); DAO (Data Access
(ActiveX Data Objects);
ADO.NET;

Технології Microsoft для роботи з БД

Слайд 3

ODBC (Open Database Connectivity)

API доступу до БД
Ціль – один код для різних

ODBC (Open Database Connectivity) API доступу до БД Ціль – один код
БД
Використовує SQL у якості робочої мови
Побудований на наборі драйверів, що забезпечують доступ до конкретних СКБД

Слайд 4

DAO надає модель об’єктів для доступу до локальних БД (ISAM джерела FoxPro,

DAO надає модель об’єктів для доступу до локальних БД (ISAM джерела FoxPro,
Paradox, Lotus 1-2-3 тощо) або до баз даних SQL через Jet (напряму або через ODBC)
Тільки реляційні БД

DAO (Data Access Objects)

Слайд 5

RDO (Remote Data Objects )

RDO надає доступ до реляційних БД через ODBC
Створювався

RDO (Remote Data Objects ) RDO надає доступ до реляційних БД через
для того, щоб можна было обходитися без ODBC API
RDO – об’єктний COM-інтерфейс до ODBC API
Як і DAO, тільки реляційні БД

Слайд 6

OLE DB та ADO

OLE DB – технологія з використанням COM-компонент – провайдерів

OLE DB та ADO OLE DB – технологія з використанням COM-компонент –
БД;
ADO – технологія з використанням COM-компонент – провайдерів БД та класу DataSet (відрізняється від DataSet в ADO.NET);

Слайд 7

Технологія ADO.NET

ADO.NET – набір класів, інтерфейсів, структур та перерахувань у бібліотеці .NET,

Технологія ADO.NET ADO.NET – набір класів, інтерфейсів, структур та перерахувань у бібліотеці
які надають доступ до реляційних джерел даних.
Основна відмінність ADO .NET від ADO – використання моделі постачальників даних замість загального набору об’єктів, що не залежать від джерел даних.

Слайд 8

Простори імен FCL

System

System.Data

System.Xml

System.Web

Globalization

Diagnostics

Configuration

Collections

Resources

Reflection

Net

IO

Threading

Text

ServiceProcess

Security

Design

ADO

SQLTypes

SQL

XPath

XSLT

Runtime

InteropServices

Remoting

Serialization

Serialization

Configuration

SessionState

Caching

Security

Services

Description

Discovery

Protocols

UI

HtmlControls

WebControls

System.Drawing

Imaging

Drawing2D

Text

Printing

System.Windows.Forms

Design

ComponentModel

Простори імен FCL System System.Data System.Xml System.Web Globalization Diagnostics Configuration Collections Resources

Слайд 9

Провайдер данных

Провайдер даних (data provider) – це набір класів ADO.NET, які дозволяють

Провайдер данных Провайдер даних (data provider) – це набір класів ADO.NET, які
отримувати доступ до визначеної БД, виконувати команди SQL і витягувати дані.
Будь-який провайдер складається з наступного набору класів:
Connection – забезпечує підключення до БД;
Command – виконує команди SQL або збережені процедури;
DataReader – надає доступний лише для однонаправле-ного читання набір записів, подключений до БД;
DataAdapter – заповнює від’єднаний об’єкт DataSet або DataTable та оновлює його вміст.
Назви класів провайдера включають префікс перед назвою типу класу. Наприклад:
OleDb<ім’яКласу> - для провайдера OleDb;
Sql<ім’яКласу> - для провайдера SqlClient.

Слайд 10

Провайдери даних Microsoft ADO.NET

Провайдери даних Microsoft ADO.NET

Слайд 11

Архітектура ADO.NET

Архітектура ADO.NET

Слайд 12

Використання провайдерів даних для роботи з БД

SQL-данні

MS SQL Server, Oracle,
MsAccess, Foxpro,

Використання провайдерів даних для роботи з БД SQL-данні MS SQL Server, Oracle,
...

SQL Server
Oracle
MySQL

ODBC

Не-SQL-данні

Directory Services, Mail,
Text, Video, ...

OLEDB

Слайд 13

Типи об’єктів ADO.NET

Об'єкти, засновані на з'єднанні – такі об'єкти провайдера даних, як

Типи об’єктів ADO.NET Об'єкти, засновані на з'єднанні – такі об'єкти провайдера даних,
Connection, Command та DataReader.
Об'єкти, засновані на вмісті – ці об'єкти у дійсності лише "упаковують" дані – DataSet, DataColumn, DataRow, DataRelation тощо.

Слайд 14

Способи роботи з БД

Приєднаний або з підтримкою з'єднання (Connected, Forward-only, read-only):
Програма робить

Способи роботи з БД Приєднаний або з підтримкою з'єднання (Connected, Forward-only, read-only):
запит, читає результати і обробляє їх
Використовується курсор "Firehose" (брандспойт)
Використовується об'єкт DataReader
Від’єднаний або з розривом з'єднання (Disconnected):
Програма робить запит, читає і зберігає результати для обробки, від'єднується від БД
Виконується робота з даними (додавання, зміна, видалення)
Мінімізується час з'єднання з базою даних
Використовується об'єкт DataSet

Слайд 15

Об'єктна модель ADO.NET

Об'єктна модель ADO.NET

Слайд 16

ExecuteXxxx

Використання класів ADO.NET

Data
Base

SQL Server організації

Connection

DataReader

DataAdapter

DataSet

Command

Fill

Update

Update, Insert, Delete

Client
Program

Комп’ютер користувача

ExecuteReader

Read

Select

Провайдер

ExecuteXxxx Використання класів ADO.NET Data Base SQL Server організації Connection DataReader DataAdapter

Слайд 17

Послідовність роботи з даними у приєднаному режимі

Установити з‘єднання з БД.
Виконати запит до

Послідовність роботи з даними у приєднаному режимі Установити з‘єднання з БД. Виконати
БД.
Створити та виконати команди
Отримати результати команди.
Закрити з‘єднання з БД.

Слайд 18

Шаблон роботи з БД у приєднаному режимі

1.) Оголосити з’єднання
try {
1.) Відкрити

Шаблон роботи з БД у приєднаному режимі 1.) Оголосити з’єднання try {
з БД

3.) Обробити результати

2.) Створити та виконати команди

4.) Звільнити ресурси
} catch ( Exception ) {
Handle exception
} finally {
try {
4.) Закрити з’єднання
} catch (Exception)
{ Handle exception }
}

Слайд 19

Клас Connection

виконує реальний обмін даними між БД та застосуванням
є частиною Data Provider
властивості
ConnectionString
ConnectionTimeout
DataBase
методи
Open()

Клас Connection виконує реальний обмін даними між БД та застосуванням є частиною
– відкрити з‘єднання
Close() – закрити з‘єднання

Слайд 20

Рядок з’єднання

Рядок з'єднання – це серія пар "ім'я-значення", розділених крапкою з комою

Рядок з’єднання Рядок з'єднання – це серія пар "ім'я-значення", розділених крапкою з
(;). Всі разом вони специфікують базову інформацію, необхідну для встановлення з'єднання.
Формат рядка з'єднання:
“param1 = val1; param2 = val2; … paramN = valN”
param – ім’я параметра рядка з'єднання
val – значення параметра

Слайд 21

Основні параметри рядка з’єднання

Data Source=(local)\SQLEXPRESS;
(local)
localhost
. (просто точка)
Initial Catalog = <ім’я БД>;
uid=<ідентифікатор>;
рwd=<пароль>;
IntegratedSecurity =True;

Основні параметри рядка з’єднання Data Source=(local)\SQLEXPRESS; (local) localhost . (просто точка) Initial

True
SSPI
yes
Provider= … (для ODBC та OLEDB)
….

Слайд 22

Приклади рядків з’єднання

string connectionString =
"Data Source=localhost;Initial Catalog=Northwind;" +
"Integrated Security=SSPI";
string

Приклади рядків з’єднання string connectionString = "Data Source=localhost;Initial Catalog=Northwind;" + "Integrated Security=SSPI";
connectionString =
"Data Source=localhost;Initial Catalog=Northwind;" +
"user id=sa; password=opensesame";
string connectionString = "Data Source=localhost;Initial Catalog=Sales;" +
"user id=sa;password=;Provider=MSDAORA";
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=C:\DataSources\Northwind.mdb";

Слайд 23

Метод SqlConnection

SqlConnection con = new SqlConnection(
@"Data Source=.\SQLEXPRESS2012;Initial" + "Catalog=kurs;Integrated Security=SSPI");
con.Open();

con.Close();

База даних

Метод SqlConnection SqlConnection con = new SqlConnection( @"Data Source=.\SQLEXPRESS2012;Initial" + "Catalog=kurs;Integrated Security=SSPI");

Програма

SqlConnection

Слайд 24

Приклад використання об’єкта Connection

// Створити об’єкт Connection.
string connectionString =
WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
SqlConnection con =

Приклад використання об’єкта Connection // Створити об’єкт Connection. string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
new SqlConnection(connectionString);
try
{ // Відкрити з’єднання.
con.Open();
lblInfo.Text = "Server Version: " + con.ServerVersion;
lblInfo.Text += "
Connection Is: " + con.State.ToString();
}
catch (Exception err)
{ // Обробка помилки з відображенням інформації.
lblInfo.Text = "Error reading the database. ";
lblInfo.Text += err.Message;
}
finally
{
con.Close();
lblInfo.Text += "
Now Connection Is:";
lblInfo.Text += con.State.ToString();
}

Слайд 25

Клас Command

Клас Command дозволяє виконувати дії з БД (вибірку, оновлення, доповнення, видалення,

Клас Command Клас Command дозволяє виконувати дії з БД (вибірку, оновлення, доповнення,
тощо).
Властивості:
CommandType:
CommandType.Text - оператори SQL;
CommandType.TableDirect – робота з конкретною таблицею;
CommandType.StoredProcedure – виклик збереженої у БД процедури.
CommandText містить:
текст оператора SQL (для типу CommandType.Text);
ім’я таблиці (для CommandType.TableDirect);
ім’я збереженої процедури з параметрами (для CommandType.StoredProcedure);
Connection – посилання на відкрите з’єднання (об’єкт Connection);
Parameters – колекція параметрів запиту.

Слайд 26

Основні методи виконання Command

ExecuteReader() – виконує оператор SELECT, створює та повертає посилання

Основні методи виконання Command ExecuteReader() – виконує оператор SELECT, створює та повертає
на об’єкт DataReader, який містить результат виконання запиту.
ExecuteNonQuery() – виконує оператори INSERT, DELETE, UPDATE на мові SQL (повертає кількість оброблених записів)
ExecuteScalar() – повертає перший рядок першого стовбця у результуючому наборі (використовуючи функції COUNT, AVG, MIN, MAX, SUM);

Слайд 27

Клас SqlCommand

SqlCommand cmd = con.CreateCommand();
cmd.CommandText = “INSERT INTO Students(FirstName, LastName)” +
“VALUES(‘Іван’, ‘Петров’)”;
cmd.ExecuteNonQuery();

SqlCommand

Клас SqlCommand SqlCommand cmd = con.CreateCommand(); cmd.CommandText = “INSERT INTO Students(FirstName, LastName)”
cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT * FROM Employees";
SqlCommand cmd = new SqlCommand("SELECT * FROM Employees", con);
SqlCommand cmd = new SqlCommand("GetEmployees", con);
cmd.CommandType = CommandType.StoredProcedure;

Слайд 28

Метод ExecuteReader()

Створює об’єкт DataReader та повертає посилання на нього.
Текст команди повинен містити

Метод ExecuteReader() Створює об’єкт DataReader та повертає посилання на нього. Текст команди
оператор Select або виклик збереженої процедури.

Слайд 29

string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
string sql =

string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString; SqlConnection con = new SqlConnection(connectionString); string sql =
"SELECT * FROM Employees";
SqlCommand cmd = new SqlCommand(sql, con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
StringBuilder htmlStr = new StringBuilder("");
while (reader.Read())
{
htmlStr.Append("
  • ");
    htmlStr.Append(reader["TitleOfCourtesy"]);
    htmlStr.Append(" ");
    htmlStr.Append(reader.GetString(1));
    htmlStr.Append("
    , ");
    htmlStr.Append(reader.GetString(2));
    htmlStr.Append(" - employee from ");
    htmlStr.Append(reader.GetDateTime(6).ToString("d"));
    htmlStr.Append("
  • ");
    }
    reader.Close();
    con.Close();
    HtmlContent.Text = htmlStr.ToString();

    Приклад виклику методу ExecuteReader()

    Слайд 30

    Клас DataReader

    Об’єкти даного класу дозволяють виконувати лише читання даних з БД, отриманих

    Клас DataReader Об’єкти даного класу дозволяють виконувати лише читання даних з БД,
    за допомогою об’єкта Command, тільки в одному напрямку (від початка до кінця).
    Одночасно об’єкт RataReader надає доступ тільки до одного запису вибірки.
    Можна визначити значення поля у записі, використовуючи индексатор
    dr[n] або dr[“ім’я поля”]

    Слайд 31

    Об’єкт DataReader

    Для переходу до наступного запису вибірки використовується метод
    bool Read() : читає

    Об’єкт DataReader Для переходу до наступного запису вибірки використовується метод bool Read()
    поточний запис та переміщує курсор на наступний запис.
    Якщо метод Read повертає true, то наступний запис прочитано, інакше повертається false.
    Для закінчення роботи з об’єктом необхідно виконати виклик методу:
    Close: закінчення роботи з даними в DataReader.

    Слайд 32

    Об’єкт DataReader

    Метод ExecuteReader() повертає посилання на об’єкт DataReader
    Об’єкт DataReader дозволяє послідовно читати

    Об’єкт DataReader Метод ExecuteReader() повертає посилання на об’єкт DataReader Об’єкт DataReader дозволяє
    записи з отриманої вибірки (запис за записом)

    DataReader ExecuteReader()

    Слайд 33

    Отримання даних вибірки

    dr[i] або dr[“ім’я”]

    DataReader

    Read()

    Вибірка даних

    Одночасно у DataRead зберігається один запис вибірки.
    При

    Отримання даних вибірки dr[i] або dr[“ім’я”] DataReader Read() Вибірка даних Одночасно у
    виклику метода Read() зчитується наступний запис.

    Слайд 34

    Приклад застосування SqlDataReader

    Приклад застосування SqlDataReader

    Слайд 35

    Читання записів за допомогою DataReader

    Поля (стовбці) поточного запису можна прочитати двома способами:
    dtReader[0]

    Читання записів за допомогою DataReader Поля (стовбці) поточного запису можна прочитати двома

    dtReader[“ChildId”] // ChildId – ім’я поля запису
    Приклад:
    string Results;
    while (dtReader.Read() == true)
    {
    Console.WriteLine(dtReader[“ChildId”] + “ “ + tReader[“name”];
    }
    Textbox1.text=Results;

    Слайд 36

    Метод ExecuteNonQuery()

    Дозволяє виконати такі команди:
    команди корегування (повертає кількість змінених записів)
    INSERT
    (INSERT

    Метод ExecuteNonQuery() Дозволяє виконати такі команди: команди корегування (повертає кількість змінених записів)
    INTO tbl (f1, f2, f3) VALUES (‘xxx’, 1986, ‘yyy’))
    UPDATE
    (UPDATE childs SET id = 27 WHERE year = 1997)
    DELETE
    (DELETE FROM childs WHERE ID = 5)
    інші команди, які не повертають значень (результат -1)
    CREATE DATABASE
    CREATE TABLE

    Слайд 37

    Приклад виклику метода ExecuteNonQuery()

    OleDbCommand Comm = new OleDbCommand();
    Comm.Connection = Conn;
    Comm.CommandType = CommandType.Text;

    Приклад виклику метода ExecuteNonQuery() OleDbCommand Comm = new OleDbCommand(); Comm.Connection = Conn;

    Comm.CommandText = "INSERT into Books(id, [year], author, name) " + "VALUES (33, 2006, ‘John’, ‘Programming’)";
    try
    {
    int rc = (int)Comm.ExecuteNonQuery();
    }
    catch (OleDbException ex)
    {
    System.Console.WriteLine(ex.Message);
    }

    Слайд 38

    Метод SqlCommand.ExecuteScalar()

    cmd.CommandText = “SELECT COUNT(Id) FROM Students”;
    int count = (int)cmd.ExecuteScalar();
    Console.WriteLine(“Count is: ”

    Метод SqlCommand.ExecuteScalar() cmd.CommandText = “SELECT COUNT(Id) FROM Students”; int count = (int)cmd.ExecuteScalar();
    + count);

    Слайд 39

    Параметри запиту

    У SQL запиті у Command.Text можна задавати змінні – параметри.
    Параметри дозволяють

    Параметри запиту У SQL запиті у Command.Text можна задавати змінні – параметри.
    міняти SQL запит без переписування його тексту.
    Параметри використовуються при виклику збереженої процедури для передачі вхідних даних та отримання результатів.
    Для Odbc поля параметра задаються символами «?»
    select EmpId, Title, FirstName, LastName
    from Employees where (FirstName = ?, LastName = ? )
    Для OleDbCommand та SqlCommand використовуються іменовані поля параметрів – @Xxxxx
    select EmpId, Title, FirstName, LastName
    from Employees
    where (FirstName = @First, LastName = @Last )

    Слайд 40

    Додавання параметрів

    Клас xxxParameter для опису параметрів запиту
    властивість ParameterName;
    властивість xxxType (наприклад, SqlDbType);
    властивість Direction

    Додавання параметрів Клас xxxParameter для опису параметрів запиту властивість ParameterName; властивість xxxType
    (ParameterDirection.Input; ParameterDirection.Output);
    властивість Value.
    В об’єкті Command є колекція параметрів (об’єктів Parameter) Parameters.
    Для використання параметра необхідно створити об’єкт Parameter та зберегти його у колекції Parameters.
    Методи додавання
    Add(parameter);
    AddWithValue(name, value);

    Слайд 41

    Приклад опису параметра

    string connectionString =
    WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    string

    Приклад опису параметра string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString; SqlConnection con = new SqlConnection(connectionString);
    sql =
    "SELECT Orders.CustomerID, Orders.OrderID, COUNT(UnitPrice) AS Items,”+
    "SUM(UnitPrice * Quantity) AS Total FROM Orders " +
    "INNER JOIN [Order Details] " +
    "ON Orders.OrderID = [Order Details].OrderID " +
    "WHERE Orders.CustomerID = @CustID " +
    "GROUP BY Orders.OrderID, Orders .CustomerID";
    SqlCommand cmd = new SqlCommand(sql, con);
    cmd.Parameters.Add("@CustID", txtID.Text);
    con.Open();
    SqlDataReader reader = cmd.ExecuteReader();
    GridView1.DataSource = reader;
    GridView1.DataBind();
    reader.Close();
    con.Close();

    Слайд 42

    Основи технології ADO.NET (частина 2) Автономні дані (disconnected)

    Лекция №11

    Основи технології ADO.NET (частина 2) Автономні дані (disconnected) Лекция №11

    Слайд 43

    Схема доступу до даних

    База
    даних

    Застосування

    Схема доступу до даних База даних Застосування

    Слайд 44

    Сценарії, в яких DataSet використовувати легше, ніж DataReader:

    потрібен зручний пакет для відправки

    Сценарії, в яких DataSet використовувати легше, ніж DataReader: потрібен зручний пакет для
    даних іншому компоненту;
    потрібен зручний формат файлу для серіалізації даних на диск;
    потрібно організувати навігацію у двох напрямках по великому об'єму даних;
    потрібно виконувати навігацію по декількох різних таблицях;
    потрібно використовувати прив'язку даних до елементів керування користувацького інтерфейсу;
    необхідно маніпулювати даними як XML;
    необхідно виконувати пакетні оновлення через веб-службу.

    Слайд 45

    Класи DataSet

    DataSet містить дві важливі складові:
    колекцію з нуля або більше таблиць

    Класи DataSet DataSet містить дві важливі складові: колекцію з нуля або більше
    (властивість Tables);
    колекцію з нуля або більше відношень, які можна застосовувати для зв'язування таблиць між собою (властивість Relationships).

    Слайд 46

    Методи DataSet

    Методи DataSet

    Слайд 47

    Типізований DataSet

    ADO.NET підтримує типізований DataSet.
    Перетворення типів при доступі до результатів для нього

    Типізований DataSet ADO.NET підтримує типізований DataSet. Перетворення типів при доступі до результатів
    не потрібні: string myBook = dsBooks.Books[0].Name;
    Насправді це зовсім інший клас, похідний від DataSet, структура якого визначається XSD-файлом (схема XML), в якому, зокрема, описані імена таблиць і стовпців.
    Структура даних повинна бути відома на період компіляції.

    Слайд 48

    Обєкт DataSet можна редагувати на клієнтській машині: редагувати записи, додавати або видаляти

    Обєкт DataSet можна редагувати на клієнтській машині: редагувати записи, додавати або видаляти
    DataRow
    Ці зміни потраплять до БД після застосування методу DataAdapter.Update
    RowState – стан рядка даних Unchanged/Modified/Added/Deleted/Detached/

    Модифікація та оновлення

    Слайд 49

    Об’єкт DataRelation

    Об’єкт DataRelation представляє зв'язок між двома полями різних таблиць
    Набір Relation –

    Об’єкт DataRelation Об’єкт DataRelation представляє зв'язок між двома полями різних таблиць Набір
    властивість об'єкта DataSet
    Є можливість отримувати пов'язані записи за допомогою методів GetChildRows та GetParentRows

    Слайд 50

    Клас DataAdapter

    DataAdapter служить мостом між одним DataTable в DataSet та джерелом

    Клас DataAdapter DataAdapter служить мостом між одним DataTable в DataSet та джерелом
    даних, включає всі доступні команди для виконання запитів та оновлення джерела даних.
    Ключові методи:

    Слайд 51

    DataReader vs. DataAdapter

    DataReader допускає швидке та ефективне односпрямова-не читання даних
    Менш гнучкий, ніж

    DataReader vs. DataAdapter DataReader допускає швидке та ефективне односпрямова-не читання даних Менш
    DataAdapter (не можна редагувати дані, не можна повернутися до прочитаного раніше запису, вимагає монопольного доступу до активного з'єднання)

    Слайд 52

    Взаємодія DataAdapter з джерелом даних

    Взаємодія DataAdapter з джерелом даних

    Слайд 53

    Приклад. Наповнення DataSet

    // Створення з’єднання та визначення тексту запиту
    string connectionString =

    Приклад. Наповнення DataSet // Створення з’єднання та визначення тексту запиту string connectionString

    WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    string sql = "SELECT * FROM Employees";
    // Створення екземпляру класу DataAdapter
    SqlDataAdapter da = new SqlDataAdapter(sql, con);
    // Створення пустого DataSet та виконання методу Fill()
    DataSet ds = new DataSet();
    da.Fill(ds, "Employees");
    // Відображення вмісту DataSet
    StringBuilder htmlStr = new StringBuilder("");
    foreach (DataRow dr in ds.Tables["Employees"].Rows)
    {
    htmlStr.Append("
  • ");
    htmlStr.Append(dr["TitleOfCourtesy"].ToString());
    htmlStr.Append(" ");
    htmlStr.Append(dr["LastName"].ToString());
    htmlStr.Append("
    , ");
    htmlStr.Append (dr["FirstName"] .ToString());
    htmlStr.Append("
  • ");
    }

    Слайд 54

    Приклад. Наповнення DataSet

    Приклад. Наповнення DataSet

    Слайд 55

    Робота з множинними таблицями та відношеннями

    string connectionString =
    WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
    SqlConnection con =

    Робота з множинними таблицями та відношеннями string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString; SqlConnection con
    new SqlConnection(connectionString);
    string sqlCat = "SELECT CategoryID, CategoryName FROM Categories";
    string sqlProd = "SELECT ProductName, CategoryID FROM Products";
    SqlDataAdapter da = new SqlDataAdapter(sqlCat, con);
    DataSet ds = new DataSet();
    try
    { con.Open();
    // Наповнити DataSet даними з таблиці Categories
    da.Fill(ds, "Categories");
    // Змінити текст команди та отримати дані
    // таблиці Products.
    da.SelectCommand.CommandText = sqlProd;
    da.Fill(ds, "Products");
    }
    finally
    { con.Close();
    }
    // Продовження див. на наступному слайді

    Слайд 56

    // Визначити відношення між Categories та Products.
    DataRelation relat = new DataRelation("CatProds",
    ds.Tables["Categories"].Columns["CategoryID"],

    // Визначити відношення між Categories та Products. DataRelation relat = new DataRelation("CatProds",

    ds.Tables["Products"].Columns["CategoryID"]);
    // Додати відношення до DataSet.
    ds.Relations.Add(relat);
    StringBuilder htmlStr = new StringBuilder("");
    // Пройти у цикліпо всіх записах категоріях та побудувати строку HTML.
    foreach (DataRow row in ds.Tables["Categories"].Rows)
    { htmlStr.Append("");
    htmlStr.Append(row["CategoryName"].ToString());
    htmlStr.Append("
      ");
      // Получить дочерние (products) записи для родителя (category).
      DataRow[] childRows = row.GetChildRows(relat);
      // Пройти по всем продуктам данной категории.
      foreach (DataRow childRow in childRows)
      {
      htmlStr.Append("
    • ");
      htmlStr.Арреnd(childRow["ProductName"].ToString());
      htmlStr.Append("");
      }
      htmlStr.Append("
    ");
    }
    HtmlContent.Text = htmlStr.ToString();

    Робота з множинними таблицями та відношеннями (2)

    Слайд 57

    Пошук визначених рядків

    // Отримати записи з таблиці Products
    DataRow[] matchRows = DataSet.Tables["Products"].Select("Discontinued =

    Пошук визначених рядків // Отримати записи з таблиці Products DataRow[] matchRows =
    0");
    // Пройти по усіх продуктах, що мають знижки та сгенерувати перелік
    htmlStr.Append("
      ");
      foreach (DataRow row in matchRows)
      {
      htmlStr.Append("
    • ");
      htmlStr.Append(row["ProductName"].ToString());
      htmlStr.Append("
    • ");
      }
      htmlStr.Append("
    ");

    Метод Select() класу DataTable дозволяє отримувати масив об'єктів DataRow на основі SQL-виразу.
    Приклад:

    Слайд 58

    Прив'язка даних

    Ключова ідея прив'язки даних полягає у асоціюванні зв'язку між об'єктом

    Прив'язка даних Ключова ідея прив'язки даних полягає у асоціюванні зв'язку між об'єктом
    даних та елементом керування, а про побудову відповідного виводу піклується інфраструктура прив'язки даних ASP.NET.
    Приклад:
    GridView1.DataSource = ds;
    GridView1.DataMember = "Employees";
    GridView1.DataBind();

    Слайд 59

    Клас DataView

    DataView служить

    Клас DataView DataView служить

    Слайд 60

    Сортування за допомогою DataView

    // Створити Connection, DataAdapter та DataSet
    string connectionString =
    WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

    Сортування за допомогою DataView // Створити Connection, DataAdapter та DataSet string connectionString

    SqlConnection con = new SqlConnection(connectionString);
    String sql =
    "SELECT TOP 5 EmployeeID, TitleOfCourtesy, LastName, FirsName FROM Employees";
    SqlDataAdapter da = new SqlDataAdapter(sql, con);
    DataSet ds = new DataSet();
    // Наповнити DataSet
    da.Fill(ds, "Employees");
    // Прив’язати оригінальні дані до элемента №1.
    grid1.DataSource = ds.Tables["Employees"];
    // Сортувати за прізвищем та прив’язати до елемента №2.
    DataView view2 = new DataView(ds.Tables["Employees"]);
    view2.Sort = "LastName";
    grid2.DataSource = view2;
    // Сортувати за іменем та прив’язати до елемента №3.
    DataView view3 = new DataView(ds.Tables["Employees"]);
    view3.Sort = "FirstName";
    grid3.DataSource = view3;
    // Ініціювати процес прив'язки даних.
    Page.DataBind();

    Слайд 61

    Операції фільтрації

    Операції фільтрації

    Слайд 62

    Фільтрація за допомогою DataView

    string connectionString =
    WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    string

    Фільтрація за допомогою DataView string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString; SqlConnection con = new
    sql = "SELECT ProductID, ProductName, UnitsInStock, UnitsOnOrder, " +
    "Discontinued FROM Products";
    SqlDataAdapter da = new SqlDataAdapter(sql, con);
    DataSet ds = new DataSet();
    da.Fill(ds, "Products");
    // Фільтрувати продукт Chocolade.
    DataView view1 = new DataView(ds.Tables["Products"]);
    view1.RowFilter = "ProductName = 'Chocolade'";
    GridViewl.DataSource = view1;
    // Фільтрувати продукты, яких немає у замовленнях та на складі.
    DataView view2 = new DataView(ds.Tables["Products"]);
    view2.RowFilter = "UnitsInStock = 0 AND UnitsOnOrder = 0";
    GridView2.DataSource = view2;
    // Фільтрувати продукти, чия назва починаєтся з букви Р.
    DataView view3 = new DataView(ds.Tables["Products"]);
    view3.RowFilter = "ProductName LIKE 'P%'";
    GridView3.DataSource = view3;
    this.DataBind();

    Слайд 63

    Розширене фільтрування з відношеннями

    DataView дозволяє застосовувати деякі складні вирази фільтрації, наприклад, на

    Розширене фільтрування з відношеннями DataView дозволяє застосовувати деякі складні вирази фільтрації, наприклад,
    основі відношень.
    Щоб створити такий фільтруючий вираз, необхідно скомбінувати дві складові:
    відношення, що пов'язує дві таблиці;
    агрегатну функцію, таку як AVG(), МАХ(), MIN() або COUNT(). Ця функція застосовується до даних у пов'язаних записах.
    Приклад:
    // Визначення відношення між Categories та Products.
    DataRelation relat = new DataRelation ("CatProds",
    ds.Tables["Categories"].Columns["CategoryID"],
    ds.Tables["Products"].Columns["CategoryID"]);
    // Додати відношення до DataSet.
    ds.Relations.Add(relat);
    // Застосування рядка з умовою до GridView
    DataView view1 = new DataView(ds.Tables["Categories"));
    viewl.RowFilter = "MAX(Child(CatProds).UnitPrice) > 50";
    GridView1.DataSource = view1;

    Слайд 64

    string connectionString =
    WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    string sqlCat =

    string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString; SqlConnection con = new SqlConnection(connectionString); string sqlCat =
    "SELECT CategoryID, CategoryName FROM Categories";
    string sqlProd = "SELECT ProductName, CategoryID, UnitPrice FROM Products";
    SqlDataAdapter da = new SqlDataAdapter(sqlCat, con);
    DataSet ds = new DataSet();
    ...
    // Визначення відношення між Categories та Products.
    DataRelation relat = new DataRelation("CatProds",
    ds.Tables["Categories"].Columns["CategoryID"],
    ds.Tables["Products"].Columns["CategoryID"]);
    // Додати відношення до DataSet.
    ds.Relations.Add(relat);
    // Створити обчислювані стовпці
    DataColumn count = new DataColumn(
    "Products (#)", typeof(int), "COUNT(Child(CatProds).CategoryID)");
    DataColunm max = new DataColumn(
    "Most Expensive Product", typeof(decimal), "MAX(Child(CatProds).UnitPrice)");
    DataColumn min = new DataColumn(
    "Least Expensive Product", typeof(decimal), "MIN(Child(CatProds).UnitPrice)");
    // Додати стовбці
    ds.Tables["Categories"].Columns.Add(count);
    ds.Tables["Categories"].Columns.Add(max);
    ds.Tables["Categories"].Columns.Add(min);
    // Показати дані
    GridView1.DataSource = ds.Tables["Categories"];
    GridView1.DataBind();

    Обчислювані стовпці

    Слайд 65

    Побудова компонента доступу до даних

    Основні рекомендації при створенні класу даних:
    Відкривайте і закривайте

    Побудова компонента доступу до даних Основні рекомендації при створенні класу даних: Відкривайте
    з'єднання швидко.
    Реалізуйте обробку помилок.
    Слідуйте практиці дизайну без станів.
    Не дозволяйте клієнтові вказувати інформацію рядка з'єднання.
    Не підключайтеся під клієнтським ідентифікатором користувача.
    Не дозволяйте клієнтам використовувати широкі відкриті запити.

    Багатошаровий дизайн класу бази даних

    Слайд 66

    Литература

    Мак-Дональд, Мэтью, Шпушта, Марио. Microsoft ASP.NET 2.0 с примерами на C# 2005

    Литература Мак-Дональд, Мэтью, Шпушта, Марио. Microsoft ASP.NET 2.0 с примерами на C#
    для профессионалов.: Пер. с англ. – М.: ООО "И.Д. Вильямс", 2007. – 1408 с.
    Рихтер Дж. CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#. 3-е изд. – СПб.: Питер, 2012. – 928 с.

    Слайд 67

    Кінець Дякую за увагу

    Кінець Дякую за увагу

    Слайд 68

    Задание оператора using для работы с базой данных

    Оператор using должен быть записан

    Задание оператора using для работы с базой данных Оператор using должен быть
    до всех других объявлений в файле и не может появиться внутри класса или объявлений модуля
    using System.Data;
    using System.Data.OleDb;
    using System.Data.SqlClient;
    using System.Data.Odbc;
    public class Form1
    {
    . . .
    }

    Слайд 69

    Технології Microsoft для роботи з БД

    ODBC – с использованием драйверов баз данных

    Технології Microsoft для роботи з БД ODBC – с использованием драйверов баз
    (описание источников данных);
    OLEDB – с использование COM компонент – провайдеров баз данных;
    ADO - с использование COM компонент – провайдеров баз данных и DataSet класса (отличный от DataSet в ADO.Net);
    ADO.Net – с использованием управляемых провайдеров БД.

    Слайд 70

    Назначение типов классов ADO.Net

    Connection – выполняет соединение с БД
    Command – подготовка и

    Назначение типов классов ADO.Net Connection – выполняет соединение с БД Command –
    выполнение SQL команд
    Parameter - для модификации объекта Command
    DataReader – для быстрого считывания данных из БД
    DataAdapter – содержит набор SQL команд (Select, Insert, Update, Delete) для работы с данными в оперативной памяти и выполняет работу по связи класса Dataset с базой данных
    CommandBuilder

    Слайд 71

    Объекты ADO.NET

    Data Set

    .NET Applications

    Data Reader

    Command Object

    Connection Object

    Managed Data Provider
    (OLEDB)

    База
    данных

    Провайдер базы данных

    ExecuteNonQuery
    ExecuteScalar

    DataAdapter

    Объекты ADO.NET Data Set .NET Applications Data Reader Command Object Connection Object

    Слайд 72

    Отсоединенный режим работы с БД

    Отсоединенный режим работы с БД

    Слайд 73

    ExecuteXxx

    Использование классов ADO.NET

    Data
    Base

    SQL Server организации

    Connection

    DataReader

    DataAdapter

    DataSet

    Command

    Fill

    Update

    Update, Insert, Delete

    Client
    Program

    Компьютер пользователя

    ExecuteReader

    Read

    Provider

    Select

    ExecuteXxx Использование классов ADO.NET Data Base SQL Server организации Connection DataReader DataAdapter

    Слайд 74

    Рядок з‘єднання

    Об’єкт SqlConnection
    Server
    Database (Initial Catalog)
    uid (User ID)
    pwd (Password)
    Об’єкт OleDbConnection
    Provider
    Data Source (Server)
    uid

    Рядок з‘єднання Об’єкт SqlConnection Server Database (Initial Catalog) uid (User ID) pwd
    (User ID)
    pwd (Password)

    Слайд 75

    ExecuteXxx

    Использование классов ADO.NET

    Data
    Base

    SQL Server организации

    Connection

    DataReader

    DataAdapter

    DataSet

    Command

    Fill

    Update

    Update, Insert, Delete

    Client
    Program

    Компьютер пользователя

    ExecuteReader

    Read

    Provider

    Select

    ExecuteXxx Использование классов ADO.NET Data Base SQL Server организации Connection DataReader DataAdapter

    Слайд 76

    ExecuteXxx

    Использование классов ADO.NET

    Data
    Base

    SQL Server организации

    Connection

    DataReader

    DataAdapter

    DataSet

    Command

    Fill

    Update

    Update, Insert, Delete

    Client
    Program

    Компьютер пользователя

    ExecuteReader

    Read

    Provider

    Select

    ExecuteXxx Использование классов ADO.NET Data Base SQL Server организации Connection DataReader DataAdapter

    Слайд 77

    Клас DataTableReader

    DataTableReader dtr = tbl.CreateDataReader();
    while(dtr.Read())
    {
    for(int i=0; I < dtr.FieldCount; i++)

    Клас DataTableReader DataTableReader dtr = tbl.CreateDataReader(); while(dtr.Read()) { for(int i=0; I {

    {
    Console.Write(“{0} = {1}”,
    dtr.GetName(i),
    dtr.GetValue(i).ToString().Trim());
    }
    Console.WriteLine();
    dtr.Close();
    }

    Слайд 78

    Об’єкт DataAdapter

    Об’єкт DataAdapter – основний клас ADO.NET, що забезпечує доступ до від’єднаних

    Об’єкт DataAdapter Об’єкт DataAdapter – основний клас ADO.NET, що забезпечує доступ до
    даних.
    DataAdapter – посередник між БД та об’єктом DataSet
    Методи Fill() (заповнення DataSet) та Update() (оновлення БД)
    Властивості Select/Insert/Delete/UpdateCommand

    Слайд 79

    У СommandText можна помістити декілька команд SQL та користуватися DataReader.NextResults() для читання

    У СommandText можна помістити декілька команд SQL та користуватися DataReader.NextResults() для читання
    наборів результатів.

    Робота з декількома наборами

    Слайд 80

    Обмеження Constraints

    Ограничение – правила работы со строками в DataTable
    Два вида ограничений: UniqueConstraint

    Обмеження Constraints Ограничение – правила работы со строками в DataTable Два вида
    и ForeignKeyConstraint
    UniqueConstraint – запрещение добавлять в таблицы дублирующиеся элементы
    ForeignKeyConstraint – правила обновления дочерних строк при изменении родительской
    Набор Constraints – свойство таблицы

    Слайд 81

    ForeignKeyConstraint

    ForeignKey – внешний ключ, обычно первичный ключ в другой таблице
    Определяемые правила: UpdateRule,

    ForeignKeyConstraint ForeignKey – внешний ключ, обычно первичный ключ в другой таблице Определяемые
    DeleteRule, AcceptRejectRule
    Свойства ограничения:
    Cascase – модификации родительской строки реплицируются в дочерние
    None – ничего не делается
    SetDefault – значение внешнего ключа устанавливается в умолчательное
    SetNull – значение внешнего ключа устанавливается в DBNull
    Имя файла: Архітектура-та-проектування-компонентних-систем.pptx
    Количество просмотров: 186
    Количество скачиваний: 0