Лабораторне заняття 4. Особливості роботи з БД за допомогою DataSet і SqlDataSource

Мета лабораторного заняття: Ознайомитися з елементом DataSet, його метою та областями застосування, властивостями та методами. Набути практичні навички застосування елементу DataSet та інших елементів технології ADO.NET для реалізації запитів БД по створенню, оновленню, видаленню даних з БД.

Розглянута раніше логіка взаємодії клієнтського додатка з базою даних, заснована на з'єднанні, виправдана для реалізації однобічного зв'язку з базою даних. Це може бути або одержання даних, або виконання запитів, зв'язаних із внесенням змін у неї. Реалізація ж складних операцій взаємодії з БД є дуже трудомістким процесом і вимагає написання великої кількості програмного коду, його налагодження і т.д. ADO.NET надає більш зручні способи організації двосторонньої взаємодії додатка з базою даних, заснованої на від’єднаних наборах даних.

Основною ідеєю використання від’єднаних наборів даних є зміни алгоритмів взаємодії додатка з базою даних за рахунок підключення до набору даних, виконання запиту і створення копії даних на стороні клієнта, відключення від БД, здійснення маніпуляцій з даними на стороні клієнта, при необхідності внесення змін у базу даних, підключення до неї, передача змін і відключення. Таким чином, всі основні маніпуляції з даними відбуваються у від’єднаному наборі даних, що представляє собою копію даних, що зберігаються в БД, а внесення змін відбувається в одній пакетній операції. Усе це зменшує час, протягом якого повинне бути відкрите з'єднання з БД, прискорює роботу і спрощує логіку взаємодії додатка з даними. Розглянемо об'єкти ADO.NET, що реалізують даний механізм.

Приклад 1. Прив’язка до даних з одним значенням.Насамперед необхідно встановити підключення до джерела даних. Для цього необхідно використовувати рядок підключення, а також об'єкт Connectіon. У даному прикладі підключення буде відбуватися до бази даних tovar, розташованої на локальному сервері SQL Server

 

string connectionString;

connectionString = "Data Source=KATYAN\\SQLEXPRESS;Initial Catalog=tovar;Integrated Security=True";

SqlConnection con = new SqlConnection(connectionString);

string sql="select * from tovar";

 

Створимо об'єкт DataAdapter і передамо йому як параметри рядок запиту, а також рядок підключення до БД.

 

SqlDataAdapter sa = new SqlDataAdapter(sql, con);

 

Тепер необхідно створити об'єкт DataSet і заповнити його даними за допомогою DataAdapter.

 

DataSet ds = new DataSet();

sa.Fill(ds, "tovar");

Як приклад розглянемо прив'язку елемента Label до даних таблиці Товари. Для цього створимо метод GetProductName(), що повертає як значення вміст першого рядка стовпця „Назва товару” таблиці tovar.

 

public string GetProductName()

{return ds.Tables["tovar"].Rows[0]["nazv"].ToString();}

 

Тепер необхідно додати елемент Label на сторінку .aspx і встановити прив'язку для властивості Text даного елемента.

 

<asp:Label ID="Label1" runat="server" Text="<%#GetProductName() %>"></asp:Label>

 

У методі Page.Load() зробимо виклик методу Page.DataBіnd(). Результат роботи даного прикладу представлений на рис. 4.1. Для забезпечення можливості виклику цього методу необхідно підключити простір імен using System.Data.SqlClient.

 

public void Page_Load(object sender, EventArgs e)

{

Page.DataBind();

}

Рис. 4.1. Вигляд веб-додатку в браузері

 

Повний текст додатку:

using System;

using System.Configuration;

using System.Data;

using System.Linq;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Data.SqlClient;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page

{

DataSet ds = new DataSet();

public void Page_Load(object sender, EventArgs e)

{ string connectionString;

connectionString = "Data Source=KATYAN\\SQLEXPRESS;Initial Catalog=tovar;Integrated Security=True";

SqlConnection con = new SqlConnection(connectionString);

string sql = "select * from tovar";

SqlDataAdapter sa = new SqlDataAdapter(sql, con);

sa.Fill(ds, "tovar");

Page.DataBind();

}

public string GetProductName()

{ return ds.Tables["tovar"].Rows[0]["nazv"].ToString();

}

}

Приклад 2. Прив’язка з множинним значенням.У наступному прикладі на сторінці розміщені два елементи DropDownLіst1 і LіstBox1, що зв'язані з тим самим джерелом даних, у якості якого виступає таблиця tovar.

 

<asp:DropDownList ID="DropDownList1" runat="server"> </asp:DropDownList>

<asp:ListBox ID="ListBox1" runat="server"></asp:ListBox>

 

В обробник події завантаження сторінки додамо код, який здійснює прив’язку зазначених елементів керування до даних таблиці БД.

 

DropDownList1.DataSource = ds.Tables["tovar"];

DropDownList1.DataTextField = "nazv";

DropDownList1.DataValueField = "kod_tov";

ListBox1.DataSource = ds.Tables["tovar"];

ListBox1.DataTextField = "nazv";

ListBox1.DataValueField = "kod_tov";

Page.DataBind();

Результат виконання наведених програмних дій є екрана форма, що представлена на рис. 4.2.

 

Рис. 4.2. Вигляд додатку в браузері

 

Приклад 3. Використання об’єкта GridView для множинного зв’язування.Самим потужним елементом по кількості можливостей є GrіdVіew. Дуже часто його приходиться використовувати для відображення інформації у вигляді таблиці. Для прив'язки GrіdVіew до джерела даних необхідно встановити значення властивості DataSource. У наступному прикладі на сторінці розміщено об'єкт GrіdVіew, що прив'язується до таблиці tovar і відображає її вміст. Для створення зв’язку з таблицею БД достатньо додати створити об’єкт GrіdVіew.

 

<asp:GridView ID="GridView1" runat="server"> </asp:GridView>

 

и в обробник події завантаження форми додати наступний фрагмент коду:

 

GridView1.DataSource = ds.Tables["tovar"];

this.DataBind();

 

Результат виконання програмних дії наведено на рис. 4.3.

 

Рис. 4.3. Відображення даних таблиці БД за допомогою GrіdVіew

Приклад 4. Використання параметризованих команд для роботи з таблицями, зв’язаними зовнішнім ключом.Нехай в БД tovar окрім таблиці, де зберігаються дані стосовно товару існують таблиці post – постачальники та order – замовлення. В таблиці order створено два поля зв’язку kod_post та kod_tov, що забезпечують відображення даних із таблиці post та order відповідно (рис. 4.4).

 

Рис. 4.4. Фрагмент бази даних для додатку

 

Помістимо на форму елементи DropDownLіst і SqlDataSource. Настроїмо дані елементи на підключення до джерела даних, що містить список товарів. Визначення цих елементів виглядають у такий спосіб. Об’єкт SqlDataSource можна створити програмним шляхом, а можна скористатися майстром конфігурації, якій з’являється після розміщення SqlDataSource на вкладці Design з вкладки ToolBox. Перш за все відкривається вікно, для створення підключення до джерела даних (рис. 4.5).

 

Рис. 4.5. Конфігурація підключення до бази даних

 

Якщо підключення вже існує, то його можна вибрати зі списку, інакше необхідно натиснути кнопку „Нове підключення”. Після цього відкриється вікно, вигляд якого наведено на рис. 4.6.

Рис. 4.6. Визначення параметрів підключення до бази даних

 

У вікні можна задати тип джерела даних, ім’я серверу та обрати необхідну базу даних. Упевнитися в правильності здійснення підключення до бази даних можна натиснувши кнопку “Test Connection”. Якщо підключення здійснилося успішно, про це буде повідомлено користувача (рис. 4.7).

 

Рис. 4.7. Системне повідомлення про вдале підключення

 

Результатом виконання перелічених дій є сформований рядок підключення до бази даних (рис. 4.8).

 

Рис. 4.8. Створений рядок підключення до бази даних

При цьому надається можливість задати програмне ім’я для створеного підключення або залишити його таким, як його створило програмне середовище (рис. 4.9).

 

Рис. 4.9. Визначення імені підключення до бази даних

 

Натиснувши кнопку Next користувачу видається вікно (рис. 4.10), в якому можна задати параметри запитів, визначити тип запитів (збережена процедура, або текстовий запит), обрати необхідно таблицю бази даних.

 

Рис. 4.10. Визначення таблиць та набору їх полів для відображення

 

Натиснувши кнопку „Advanced” можна автоматично сформувати запити додавання, видалення та оновлення даних обраної таблиці БД (рис. 4.11).

 

Рис. 4.11. Формування автоматичних запитів до бази даних

А натиснувши кнопку „Next” можна впевнитися в правильності створеного запиту (рис. 4.12)

 

Рис. 4.12. Тестування створених запитів

 

На цьому дії з майстром конфігурації об’єкта SqlDataSource вважаються завершеними, остаточне форматування можна здійснити в програмному коді додатку. Після виконання зазначених дій, у файл web.confіg автоматично додався код створення рядка підклюення до БД.

 

<connectionStrings>

<add name="tovarConnectionString" connectionString="Data Source=KATYAN\SQLEXPRESS;Initial Catalog=tovar;Integrated Security=True"

providerName="System.Data.SqlClient" />

</connectionStrings>

А у файлі .aspx формується програмний код наступного вмісту:

<asp:SqlDataSource ID="SqlDataSource1" runat="server"

ConnectionString="<%$ ConnectionStrings:tovarConnectionString %>"

SelectCommand="SELECT Distinct [kod_tov],[nazv],[gost] FROM [tovar]" >

</asp:SqlDataSource>

Для відображення даних таблиці товар у випадаючому списку необхідно задати джерело даних. Це можна здійснити програмним шляхом або за допомогою майстра конфігурації (рис. 4.13).

 

Рис. 4.13. Визначення джерела даних для елемента DropDownLіst

Натиснувши Choose Data Source, відкривається вікно (рис. 4.14), в рамках якого можна обрати існуюче джерело або створити нове. В нашому прикладі в якості джерела даних використовуємо створений об’єкт SqlDataSource.

Рис. 4.14. Обрання об’єкта SqlDataSource

 

Обравши джерело даних, користувач може вибрати поле, яке буде відображатися у видаючому списку (рис. 4.15).

Рис. 4.15. Визначення полів для відображення в елементі DropDownLіst

 

В результаті до програмного коду додатка додається фрагмент:

 

<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID= "SqlDataSource1" DataTextField="nazv" DataValueField="kod_tov" Width="200px" AutoPostBack="true">

</asp:DropDownList>

Варто звернути увагу на те, що властивість AutoPostBack елемента DropDownLіst установлено рівним true. Це необхідно для забезпечення автоматичного ініціювання зворотного відсилання при зміні поточного елемента списку. Це необхідно для того, щоб сторінка змінювалася при виборі іншого елемента списку. Вигляд сторінки стає наступним (рис. 4.16).

 

Рис. 4.16. Вигляд веб-додатку в браузері

В рамках наведеного прикладу необхідно зробити так, щоб при виборі назви товару зі списку, вміст елемента GrіdVіew, що відображає закупівлі оновлювався. Для реалізації даного механізму помістимо на форму елементи GrіdVіew і ще один SqlDataSource. Настроїмо SqlDataSource у відповідності з наступним визначенням. Створимо такий запит вибірки даних, який б давав змогу в залежності від обраного товару видавати в GrіdVіew опис замовлень, де він зустрічається. Програмний код створення об’єкта SqlDataSource наступний:

 

<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString= "<%$ ConnectionStrings:tovarConnectionString %>" SelectCommand="SELECT orders.kod_oper, orders.data, post.nazv AS postav, orders.kol, orders.price, orders.kol * orders.price AS Стоимость FROM orders INNER JOIN post ON orders.kod_post = post.kod_post WHERE (orders.kod_tov = @product )" >

<SelectParameters>

<asp:ControlParameter ControlID="DropDownList1" Name="product" PropertyName= "SelectedValue" /> </SelectParameters>

</asp:SqlDataSource>

 

Ключовими елементами настроювання SqlDataSource є рядок запиту, визначений у властивості SelectCommand і параметри, визначені в розділі <SelectParameters>. У рядку запиту визначений параметр @рroduct, що використовується для фільтрації списку закупівель за значенням коду товару. У розділі параметрів визначений один параметр, для якого встановлене ім'я рroduct. Значення для цього параметра витягається з властивості SelectedValue об'єкта DropDownLіst1. Залишилося задати створений об’єкт SqlDataSource в якості джерела даних для об’єкта GridView. Програмний код наступний:

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource2"

AutoGenerateColumns="False" DataKeyNames="kod_oper">

<Columns>

<asp:BoundField DataField="kod_oper" HeaderText="kod_oper" InsertVisible= "False" ReadOnly="True" SortExpression="kod_oper" />

<asp:BoundField DataField="data" HeaderText="data" SortExpression="data" />

<asp:BoundField DataField="postav" HeaderText="postav" SortExpression="postav" />

<asp:BoundField DataField="kol" HeaderText="kol" SortExpression="kol" />

<asp:BoundField DataField="price" HeaderText="price" SortExpression="price" />

<asp:BoundField DataField="Стоимость" HeaderText="Стоимость" ReadOnly= "True" SortExpression="Стоимость" />

</Columns>

</asp:GridView>

Результатом описаних дій є екрана форма (рис. 4.17, 4.18), на якій в залежності від обраного товару користувачу видається інформація стосовно всіх його замовлень.

 

Рис. 4.17. Визначення параметрів для запиту

 

Рис. 4.18. Відображення результатів запиту