Формальные и визуальные методы конструирования компонентов

Содержание

Слайд 2

План наступих лекцій

Основи технології доступу до даних ADO.NET. Архітектура ADO.NET: набір даних

План наступих лекцій Основи технології доступу до даних ADO.NET. Архітектура ADO.NET: набір
та провайдер даних
Об’єктна модель ADO.NET. Робота з БД у приєднаному режимі. Класи Connection, Command, DataReader, Transaction
Робота з БД у від'єднаному режимі. Класи DataSet, DataReader, Tables та Relationships
Основи прив'язки даних
Розширені елементи керування даними GridView, DetailsView, FormView. Елементи керування джерелами даний

Слайд 3

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

ODBC API (Open Database Connectivity) RDO (Remote Data Objects) DAO (Data Access
(Object Linking and Embedding, Database)
ADO (ActiveX Data Objects)
ADO.NET

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

Слайд 4

Простори імен 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

Слайд 5

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

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

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

Слайд 6

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

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

Слайд 7

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

Переваги моделі провайдерів
Розширюваність моделі – можна створювати власні провайдери
Кожен провайдер може

Архітектура ADO.NET Переваги моделі провайдерів Розширюваність моделі – можна створювати власні провайдери
використовувати відповідну оптимізацію та додавати нестандартні засоби

Слайд 8

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

Об'єкти, засновані на з'єднанні – об'єкти провай-дера даних, що виконують

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

Слайд 9

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

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

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

Слайд 10

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

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

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

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

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

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

Слайд 11

Клас Connection

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

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

Слайд 12

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

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

Рядок з’єднання Рядок з'єднання – серія розділених крапкою з комою пар "ім'я-значення",
специфікують базову інформацію, необхідну для встановлення з'єднання
Основні параметри рядка з'єднання
Data Source=(local)\SQLEXPRESS; - сервер, на якому знаходиться БД
(local), localhost, . (просто точка)
Initial Catalog=<ім’я БД>; - БД, яку слід використовувати
IntegratedSecurity=True; - інтегрована безпека
True, SSPI, yes
user id=<ідентифікатор>; - ім’я користувача
рwd=<пароль>; - пароль користувача
Provider=<провайдер> - налаштування, що ідентифікують драйвер (для ODBC та OLEDB)
тощо

Слайд 13

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

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";

Слайд 14

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

// Створити об’єкт Connection
string connectionString =
"Data

Приклад використання об’єкта Connection // Створити об’єкт Connection string connectionString = "Data
Source=localhost;Initial Catalog=Northwind;" +
"Integrated Security=SSPI";
SqlConnection con = 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();
}

Слайд 15

Клас Command

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

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

Слайд 16

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

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

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

Слайд 17

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()

    Слайд 18

    Клас DataReader

    Дозволяє послідовно читати записи, отримані з БД за допомогою об’єкта Command,

    Клас DataReader Дозволяє послідовно читати записи, отримані з БД за допомогою об’єкта
    тільки в одному напрямку (від початку до кінця)
    Одночасно надає доступ тільки до одного запису вибірки
    Методи
    Read() - читає поточний запис та переміщує курсор на наступний запис (повертає true, якщо наступний запис прочитано, інакше повертає false)
    Close() - закінчення роботи з даними в DataReader
    GetValue() – повертає значення поля за вказаним ім‘ям або індексом
    Значення поля у записі можна визначити, використо-вуючи индексатор
    dr[n] або dr[“ім’я_поля”]

    Слайд 19

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

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

    Слайд 20

    Метод ExecuteNonQuery()

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

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

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

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

    Слайд 21

    Приклад: виклик методу SqlCommand.ExecuteScalar()

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

    Приклад: виклик методу SqlCommand.ExecuteScalar() cmd.CommandText = “SELECT COUNT(Id) FROM Students”; int count
    is: ” + count);

    Слайд 22

    Атаки впровадженням SQL

    Впровадження SQL (SQL injection) – процес передачі SQL-коду застосуванню у

    Атаки впровадженням SQL Впровадження SQL (SQL injection) – процес передачі SQL-коду застосуванню
    такий спосіб, який не передбачений його розробником
    можливе через поганий дизайн програми, напр., при побудові SQL-рядків для створення команд з уведеними користувачем значеннями

    string connectionString =   WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString; SqlConnection con = new SqlConnection(connectionString); string 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 = ' " + txtID.Text + "' " +   "GROUP BY Orders.OrderID, Orders.CustomerID"; SqlCommand cmd = new SqlCommand(sql, con);
    con.Open(); SqlDataReader reader = cmd.ExecuteReader(); ...

    Слайд 23

    Атаки впровадженням SQL (2)

    Припустимо у текстове поле уведений текст ALFKI' OR '1'

    Атаки впровадженням SQL (2) Припустимо у текстове поле уведений текст ALFKI' OR
    = '1
    Буде отримано запит
    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 = 'ALFKI' OR '1' = '1' GROUP BY Orders.OrderID, Orders.СustomerID
    Умова 1=1 істинна для усіх рядків, тому замість інформації про поточного замовника, буде виведена інформація про усі замовлення

    Слайд 24

    Параметрезовані команди

    Параметрезована команда - команда, що використовує символи-заповнювачі (placeholder parameter) у тексті

    Параметрезовані команди Параметрезована команда - команда, що використовує символи-заповнювачі (placeholder parameter) у
    SQL
    Дозволяють міняти 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 )

    Слайд 25

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

    Властивості класу xxxParameter для опису параметрів запиту
    ParameterName - ім'я xxxParameter
    xxxType

    Додавання параметрів Властивості класу xxxParameter для опису параметрів запиту ParameterName - ім'я
    (напр., SqlDbType) - тип даних параметра, що представляється у вигляді CLR-типу
    Direction - вид параметра (тільки для введення, тільки для виведення, для введення і для виведення або параметр для повернення значення)
    Value - значення параметра
    В об’єкті Command є колекція параметрів (об’єктів Parameter) Parameters
    Для використання параметра необхідно створити об’єкт Parameter та зберегти його у колекції Parameters
    Методи додавання
    Add(parameter), AddWithValue(name, value)

    Слайд 26

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

    Варіант попереднього запиту (за ідентифікатором замовника відобразити перелік його замовлень),

    Приклад: опис параметру Варіант попереднього запиту (за ідентифікатором замовника відобразити перелік його
    що виключає можливість атаки впровадженням

    string connectionString =
    WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    string 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();
    ...

    Слайд 27

    Крос-платформне програмування Лекція 10 Технологія ADO.NET. Автономний режим доступу до даних
    23 квітня,

    Крос-платформне програмування Лекція 10 Технологія ADO.NET. Автономний режим доступу до даних 23
    2014
    Примітка: слайди лекції підготовлені за матеріалами http://jskreator.narod.ru/proaspnet20cs/glance.htm

    Слайд 28

    Коли DataSet краще, ніж DataReader

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

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

    Слайд 29

    Клас DataSet

    Властивості
    Tables - колекція з нуля або більше таблиць
    Relationships - колекція з

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

    Слайд 30

    Клас DataAdapter

    DataAdapter – забезпечує доступ до від’єднаних даних
    Посередник між БД та

    Клас DataAdapter DataAdapter – забезпечує доступ до від’єднаних даних Посередник між БД
    об’єктом DataSet
    Включає усі доступні команди для виконання запитів та оновлення джерела даних
    Властивості
    SelectCommand, InsertCommand, DeleteCommand, UpdateCommand
    Ключові методи

    Слайд 31

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

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

    Слайд 32

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

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

    Слайд 33

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

    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();
    }
    // Визначити відношення між Categories та Products
    DataRelation relat = new DataRelation("CatProds",
    ds.Tables["Categories"].Columns["CategoryID"],
    ds.Tables["Products"].Columns["CategoryID"]);
    // Додати відношення до DataSet.
    ds.Relations.Add(relat);
    // Продовження див. на наступному слайді

    Слайд 34

    // Відобразити дані у формі
    StringBuilder htmlStr = new StringBuilder("");
    // Пройти у цикліпо

    // Відобразити дані у формі 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)

    Слайд 35

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

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

    Пошук визначених рядків Метод Select() класу DataTable дозволяє отримувати масив об'єктів DataRow
    основі SQL-виразу
    Приклад: отримати усі фактори цілі "Выбор дома"

    Слайд 36

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

    Прив'язка даних – засіб, що дозволяє асоцію-вати джерело даних з елементом

    Прив'язка даних Прив'язка даних – засіб, що дозволяє асоцію-вати джерело даних з
    керування для автоматичного відображення даних у цьому елементі керування
    Виділяють прив'язку даних
    з одним значенням (single-value) – зв'язує властивість елемента керування з джерелом даних, але елемент керування може відображати одне значення
    підтримують TextBox, LinkButton, Image, спискові елементи тощо
    з множиною значень (repeated-value) – елементи керування можуть відображати набори значень
    підтримують ListBox, GridView тощо

    Слайд 37

    Клас DataView

    Клас DataView - визначає зовнішнє подання об'єкта DataTable, тобто подання даних

    Клас DataView Клас DataView - визначає зовнішнє подання об'єкта DataTable, тобто подання
    у DataTable, яке може включати користувацькі налаштування фільтрації та сортування
    Дозволяє показати тільки підмножину загального набору даних таблиці , без необхідності обробляти або змінювати дані
    Кожен об'єкт DataTable має DataView за промовчан-ням, хоча допускається створювати безліч об'єктів DataView для подання різних видів однієї таблиці
    Властивості
    Sort – задає один або декілька розділених комою порядків (полів) сортування стовпців
    RowFilter - задає підмножини рядків на підставі значень їх стовпців

    Слайд 38

    Приклад: сортування за допомогою DataView

    // Створити Connection, DataAdapter та DataSet
    string connectionString =

    Приклад: сортування за допомогою DataView // Створити Connection, DataAdapter та DataSet string

    WebConfigurationManager.ConnectionStrings["Northwind"].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();

    Слайд 39

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

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

    Слайд 40

    Приклад: фільтрація за допомогою DataView

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

    Приклад: фільтрація за допомогою DataView string connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString; SqlConnection con =

    string 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();

    Слайд 41

    Лабораторна робота №5 (частина 2)

    Лабораторна робота №5 (частина 2)

    Слайд 42

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

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

    Розширене фільтрування з відношеннями DataView дозволяє застосовувати деякі складні вирази фільтрації, напр.,
    основі відношень
    Фільтруючий вираз є комбінацією
    відношення, що пов'язує дві таблиці
    агрегатної функції, напр., AVG(), МАХ(), MIN() або COUNT(), що застосовується до даних у пов'язаних записах
    Приклад: показати категорії, що містять продокти, дорожчі за 50 долларів

    // Визначення відношення між 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;

    Слайд 43

    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();

    Приклад: обчислювані стовпці

    Слайд 44

    DataReader vs. DataAdapter

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

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

    Слайд 45

    Крос-платформне програмування Лекція 11 Розширені елементи керування даними. Основи прив'язки даних
    30 квітня, 2014
    Примітка:

    Крос-платформне програмування Лекція 11 Розширені елементи керування даними. Основи прив'язки даних 30
    слайди лекції підготовлені за матеріалами http://jskreator.narod.ru/proaspnet20cs/glance.htm

    Слайд 46

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

    Прив'язка даних – засіб, що дозволяє асоцію-вати джерело даних з елементом

    Прив'язка даних Прив'язка даних – засіб, що дозволяє асоцію-вати джерело даних з
    керування для автоматичного відображення даних у цьому елементі керування
    Виділяють прив'язку даних
    з одним значенням (single-value) – зв'язує властивість елемента керування з джерелом даних, але елемент керування може відображати одне значення
    підтримують TextBox, LinkButton, Image тощо
    з множиною значень (repeated-value) – елементи керування можуть відображати набори значень
    підтримують ListBox, GridView тощо

    Слайд 47

    Приклад: прив'язка одного значення

    Приклад: прив'язка одного значення

    Слайд 48

    Прив'язка множини значень

    Спискові ЕК, що підтримують прив'язку множини значень
    усі ЕК, що генерують

    Прив'язка множини значень Спискові ЕК, що підтримують прив'язку множини значень усі ЕК,
    свій код з використанням дескриптора