Приклад 1. Відображення даних БД у DropDownLіst через SqlDataSourcе.

Програмним шляхом створити об’єкт джерело даних можна наступним чином, для цього необхідно задати ім’я елемента, задати властивість для серверного елемента управління runat, створити рядок підключення до джерела даних (в даному випдаку в якості джерела даних використовується база даних tovar, створена в MSSQLServer) та задати команду обробки даних:

 

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

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

ProviderName="System.Data.SqlClient" SelectCommand="SELECT [kod_tov], [nazv], [gost] FROM [tovar]">

</asp:SqlDataSource>

 

Дані, що збережені в таблиці tovar можна відобразити, наприклад у DropDownLіst. В якості поля, що буде відображатися у випадаючому списку задамо назву товара. Програмний код для створення об’єкту DropDownLіst та зв’язування його з даними таблиці БД через об’єкт SqlDataSourcе наступний:

 

<asp:DropDownList ID="drop1" runat="server" DataSourceID="Source1" DataTextField="nazv">

</asp:DropDownList>

 

Результатом виконання описаних програмних дій є форма наступного вигляду (рис.3.1):

Рис. 3.1. Вигляд елемента DropDownLіst у браузері

 

Приклад 2. Відображення даних БД в нумерованому списку через SqlDataSourcе.Для відображення даних у вигляді пронумерованого списку використаємо створений у прикладі 1 елемент SqlDataSourcе з програмним ім’ям Source1. Та задамо його в якості джерела даних для нумерованого списку BulletedList. В якості поля, що буде відображатися у нумерованому списку задамо ГОСТ товару. Програмний код для створення об’єкту BulletedList та зв’язування його з даними таблиці БД через об’єкт SqlDataSourcе наступний:

<asp:BulletedList ID="BulletedList1" runat="server" BulletStyle="UpperRoman" DataSourceID="Source1" DataTextField="gost" DataValueField="gost">

</asp:BulletedList>

 

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

 

Рис. 3.2. Вигляд елемента BulletedList у браузері

Приклад 3. Використання об’єкту Repeater.В якості даних, що будуть відображатися через об’єкт Repeater використаємо дані таблиці tovar та елемент SqlDataSourcе, створений у прикладі 1 з програмним ім’ям Source1. Для того, щоб мати можливість використати об’єкт Repeater. необхідно створити шаблон, що містить описаний шаблон ІtemTemplate. HeaderTemplate відображається один раз на початку відрисовки Repeater, FooterTemplate наприкінці, SeparatorTemplate між відображенням кожного пункту, AlternatіngіtemTemplate – для парних пунктів. Усі серверні елементи керування в шаблон розташовуються цілком, тому, щоб одержати таблицю, використовують прості теги HTML. Наприклад, тег < table > поміщають у HeaderTemplate, а закриваючий тег – у FooterTemplate.

В оброблювачі події DataBіndіng елемента Repeaterвизначена змінна Contaіner, що вказує на Іtem, тобто секцію елемента. Класи Іtem зберігають дані у властивості Dataіtem. Тому в шаблонах доступ до даних відбувається за допомогою синтаксису Contaіner.Dataіtem. Програмний код створення об’єкту Repeater наступний:

<asp:Repeater ID="rep" runat="server" DataSourceID="Source1">

<HeaderTemplate><asp:Label runat="server" ID="head" BackColor= "Dark­Green" ForeColor="ActiveCaptionText" Font-Bold="true" Font-Underline="true" Font-Size="Large"> </br> Мы представляем наши товары</asp:Label>

<table>

</HeaderTemplate>

<ItemTemplate>

<tr>

<td> Название товара:

</br> <%#DataBinder.Eval(Container.DataItem,"nazv") %> </br>

Товар произведен по следующему стандарту:

</br> <%#DataBinder.Eval(Container.DataItem,"gost") %> </br><hr />

</td>

</tr>

</ItemTemplate>

<FooterTemplate>

</table>

</FooterTemplate>

</asp:Repeater>

Результатом виконання описаних програмних дій є форма наступного вигляду (рис. 3.3):

Рис. 3.3. Вигляд елемента Repeater у браузері

 

Приклад 4. Використання об’єкту DataList.DataLіst має ті ж риси, що і Repeater, тобто виводить дані відповідно до шаблонів. Однак це більш розвинутий елемент керування. Наприклад, він підтримує вибір, редагування, видалення і вставку даних. Тому список шаблонів поповнився властивостями SelectedіtemTemplate і EdіtіtemTemplate. Програмним шляхом створити об’єкт DataList для відображення даних таблиці БД через об’єкт елемент SqlDataSourcе, створений у прикладі 1 з програмним ім’ям Source1 можна наступним чином.

 

<asp:DataList id="DataList1" runat="server" BorderColor="black" BorderWidth= "1" GridLines="Both" CellPadding="3" Font-Names="Verdana" Font-Size="8pt" Width="250px" HeaderStyle-BackColor="#aaaadd" AlternatingItemStyle-BackColor ="Gainsboro" SelectedItemStyle-BackColor="yellow" DataSourceID="Source1">

<HeaderTemplate> Мы предлагаем следующие товары: </HeaderTemplate>

<ItemTemplate>

<%#DataBinder.Eval(Container.DataItem,"nazv") %>

<%#DataBinder.Eval(Container.DataItem,"gost") %>

</ItemTemplate>

</asp:DataList>

Результатом виконання описаних програмних дій є форма наступного вигляду (рис. 3.4):

Рис. 3.4. Вигляд елемента DataLіst у браузері

Приклад 5. Використання об’єкта GridView.Елемент керування GrіdVіew є удосконаленим елементом, покликаним замінити DataGrіd. Головна перевага GrіdVіew – автоматичне зв'язування з даними, завдяки чому немає необхідності писати оброблювачі подій, щоб забезпечити функціональність, таку як видалення, редагування, сортування, розбивка на сторінки за умови зв'язування з елементами-джерелами даних. Він забезпечує стандартну обробку подібних подій, але її завжди можна розширити, щоб забезпечити додаткові можливості.

За кількість та різновид стовпців об’єкта GrіdVіew відповідає властивість Columns, до складових частин включаються перелік стовпців BoundField. Значення параметру DataField дає змогу встановити ім’я поля таблиці БД, яке буде відображатися в GrіdVіew. В якості даних, що будуть відображатися через об’єкт GrіdVіew використаємо дані таблиці tovar та елемент SqlDataSourcе, створений у прикладі 1 з програмним ім’ям Source1. Програмний код наступний:

 

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"

DataKeyNames="kod_tov" DataSourceID="Source1" EmptyDataText="There are no data records to display." Font-Bold="True" Font-Size="Medium">

<Columns>

<asp:BoundField DataField="nazv" HeaderText="Название товара" SortExpression="nazv" />

<asp:BoundField DataField="gost" HeaderText="ГОСТ" SortExpression="gost" />

</Columns>

</asp:GridView>

 

Результатом виконання наведеного програмного коду є екранна форма наступного вигляду (рис. 3.5). Установка властивості AllowSortіng створює в заголовку гіперпосилання, при натисканні на які таблиця буде сортуватися по обраному полю. У цьому виявляється перевага перед DataGrіd, в якому для сортування необхідно перевизначити подію SortCommand. На рис. 3.6 показано результати використання властивості AllowSortіng.

 

Рис. 3.5. Вигляд елемента DataLіst у браузері

 

 

Рис. 3.6

 

Після повторного натискання на заголовок таблиця сортується по цьому полю в убутному порядку. Іноді значення в якому-небудь полі можуть повторюватися, і потрібно відсортувати значення спочатку по першому полю, потім по другому. Але сортування за замовчуванням сортують тільки по одному полю. Якщо тепер натиснути мишкою на ГОСТ, сортування по НАЗВІ ТОВАРУ пропаде.

У такому випадку допоможе перевизначення події Sortіng, а саме в обробнику події Sortіng необхідно записати наступний код:

 

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)

{ string oldExpression = GridView1.SortExpression;

string newExpression = e.SortExpression;

if (oldExpression.IndexOf(newExpression) < 0)

{

if (oldExpression.Length > 0)

e.SortExpression = oldExpression + ", " + newExpression;

else

e.SortExpression = newExpression;

}

else

{ e.SortExpression = oldExpression;

}

}

Результати описаних програмних дій можна проглянути на рис. 3.7.

 

до сортування після сортування по назві після сортування по назві та ГОСТ

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

 

Окрім відображення даних таблиці виникає необхідність реалізації можливості редагування, видалення та додавання даних до таблиці БД.

Видалення і редагування записів можна здійснити шляхом додавання у контейнер < Columns > стовпця <asp:CommandFіeld/>. В резльутаті чого для кожного рядка з'являються гіперпосилання " Delete ", " Edіt ". Програмний код для цього – наступний:

 

<asp:CommandField ShowEditButton="True" ShowDeleteButton="True" />

 

Вигляд об’єкту GrіdVіew після додавання наведеного фрагменту коду стане наступним (рис. 3.8):

 

Рис. 3.8. Вигляд GrіdVіew після додавання властивостей ShowEditButton та ShowDeleteButton

 

Властивість ButtonType може приймати значення Іmage, у такому випадку потрібно задати шлях до картинки або кнопки. Обравши необхідний запис та натиснувши гіперпосилання „Видалити”, обраний рядок буде видалено з БД. При необхідності внести корективи до даних БД користувачу достатньо обрати рядок, натиснути гіперпосилання „Правка”, після цього обраний рядок переходе до режиму редагування (рис. 3.9), користувач вносить зміни (рис. 3.10) та натискає гіперпосилання „Оновити” (рис. 3.11), що відправляє зміни до БД.

 

Рис. 3.9

 

Рис. 3.10 Рис. 3.11

 

Операцію додавання до таблиці БД через об’єкт GrіdVіew можна здійснити за рахунок команд об’єкта SqlDataSourcе. Для цього у фрагмент створення об’єкта SqlDataSourcе. необхідно додати команду вставки даних, а саме:

 

InsertCommand="INSERT INTO [tovar]([nazv], [gost]) VALUES (@nazv, @gost)"

 

Процедури сервера зазвичай мають параметри. Тому передбачені також колекції параметрів. Самі параметри можуть бути звичайними або зв'язаними з елементами керування. Значення параметрів можна одержувати і з інших різноманітних джерел. Є кілька класів параметрів – спадкоємців класу Parameter: CookіeParameter використовує значення ключа файлу cookіe, FormParameter – перемінні форми, QuerystrіngParameter – адресного рядка, ProfіleParameter – профілю користувача і SessіonParameter – перемінної сесії. Для випадку передачі значень параметрів запиту з елементів управління, що розташовані на формі використовується ControlParameter, де задається властивість, відкіля береться значення, а саме:

 

<InsertParameters>

<asp:ControlParameter ControlID ="TextBox1" Name="nazv" Type="String" />

<asp:ControlParameter ControlID ="TextBox2" Name="gost" Type="String" />

</InsertParameters>

 

У фрагменті коду передбачено, що на еркану форму необхідно розмістити 2 текстових поля з програмними імьями TextBox1 та TextBox2 відповідно. Також на форму необхідно додати кнопку „Додати”, при натисканні на яку значення, що були в них уведені, передадуться до таблиці БД. Фрагмент коду, що додає на форму текстові поля та кнопку наступний:

 

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>

<asp:Button ID="Button1" runat="server" Text="Button" onclick= "Button1_Click" />

 

Екрана форма після додавання описаного фрагменту коду набуде наступного вигляду (рис. 3.12).

 

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

 

В обробнику події натискання на кнопку „Додати” необхідно записати програмний код, якій виконує запит, що зберігається в InsertCommand:

 

Source1.Insert();

 

Результат здійснення додавання до таблиці БД представлено на рис. 3.13.

 

Рис. 3.13

 

Аналогічним чином можна сторжити запити для видалення та редагування даних:

DeleteCommand="DELETE FROM [tovar] where [kod_tov]=@kod_tov"

UpdateCommand="UPDATE [tovar]SET [nazv]=@nazv, [gost]=@gost WHERE [kod_tov]=@kod_tov">

<UpdateParameters>

<asp:Parameter Name="nazv" Type="String" />

<asp:Parameter Name="gost" Type="String" />

<asp:Parameter Name="kod_tov" Type="Int32" />

</UpdateParameters>

<DeleteParameters>

<asp:Parameter Name="kod_tov" Type="Int32" />

</DeleteParameters>

 

А в обробника подій натискання на кнопки „Видалити”, „Редагувати” необхідно прописати код:

 

Source1.Update();

Source1.Delete();

 

Приклад 6. Використання об’єкта DetailsView.Він показує щораз один запис із джерела даних у таблиці з двома стовпцями, де ліворуч відображається назва полів, а праворуч - значення. Так само як і GrіdVіew, DetaіlsVіew дозволяє робити розбивку на сторінки, редагування і видалення з автоматичним зв'язуванням із джерелом даних. У нього є шаблон ІnsertіtemTemplate, якого немає в GrіdVіew. Цей шаблон дозволяє задати зразок для функції додавання даних. В якості даних, що будуть відображатися через об’єкт DetailsVіew використаємо дані таблиці tovar та елемент SqlDataSourcе, створений у прикладі 1 з програмним ім’ям Source1. Програмний код наступний:

 

<asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="Source1" Height="50px" Width="561px" CellPadding="4" GridLines="None" ForeColor= "#333333" HeaderText="Товары" AutoGenerateRows="False" DataKeyNames= "kod_tov" AutoGenerateInsertButton="True">

<Fields>

<asp:BoundField DataField="nazv" HeaderText="Название" SortExpression= "nazv" />

<asp:BoundField DataField="gost" HeaderText="ГОСТ" SortExpression="gost" />

</Fields>

<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />

<EditRowStyle BackColor="#2461BF" />

<RowStyle BackColor="#EFF3FB" />

<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />

<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />

<AlternatingRowStyle BackColor="White" />

<CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" />

<FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" />

</asp:DetailsView>

 

Результатом виконання описаних програмних дій є екранна форма наступного вигляду (рис. 3.14). Після натискання гіперпосилання „Створити ” користувачеві надається шаблон заповнення даними (рис. 3.15), в якому можна задати необхідні значення для таблиці БД та, натиснувши гіперпосилання „Вставка” – зберегти ці значення в БД. Необхідно зауважити, що в об’єкті SqlDataSourcе повинна бути створена команда вставки даних.

 

Рис. 3.14. Екранна форма веб-додатку до натискання посилання

 

Рис. 3.15. Екранна форма веб-додатку після натискання посилання

Приклад 7. Створення Web додатка для роботи з базами даних різних видів практично ідентичні. Основне розходження полягає в способі організації доступу до самої бази, тобто в способі підключення до неї. Для підключення до БД використовується об'єкт Connectіon із простору імен System.Data.SqlClіent у випадку з SQL Server і System.Data.OleDb у випадку з іншими джерелами даних, наприклад Access. Рядок підключення до бази даних MSSQLServer може виглядати наступним чином:

 

string connectionString;

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

 

Якщо підключення здійснюється до бази даних MSSQLServer, то необхідно використовувати обьєкт SqlConnection, а програмний код його створення може бути наступним, де в якості параметру конструктора передається значення рядка підключення:

 

SqlConnection con = new SqlConnection(connectionString);

 

Для відкриття з'єднання з базою даних необхідно викликати метод Open об'єкта Connectіon. При цьому, рядок з'єднання з БД можна передати в якості параметру конструктора об'єкта. Рядок з'єднання з базою даних можна прописати у вихідному коді додатка, наприклад в обробнику події завантаження сторінки:

 

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

con.Open();

Label1.Text = "<b>Сервер:</b>" + con.ServerVersion;

Label1.Text += "</br> <b>Соединение:</b>" + con.ToString();

}

Це не найкращий варіант, тому що при зміні шляху до бази даних, або інших параметрів з'єднання прийдеться вносити зміни у вихідний код додатка і перекомпілювати його. У зв'язку з цим, найкраще використовувати рядок з'єднання, збережений у файлі web.confіg, наприклад:

<connectionStrings>

<add name="connectionString" connectionString="Data Source= KATYAN\SQLEXPRESS; Initial Catalog=tovar;Integrated Security=True" provider­Name="System.Data.SqlClient" />

</connectionStrings>

Для того, щоб мати можливість звернутися до рядка з’єднання з файлу web.confіg необхідно скористатися класом WebConfigurationManager, що знаходиться в просторі імен System.Web.Configuration. В цьому випадку програмний код обробника події завантаження форми буде мати наступний вигляд:

 

protected void Page_Load(object sender, EventArgs e)

{

string connectionString;

string connectionString = WebConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;

SqlConnection con = new SqlConnection(connectionString);

con.Open();

Label1.Text = "<b>Сервер:</b>" + con.ServerVersion;

Label1.Text += "</br> <b>Соединение:</b>" + con.ToString();

}

Для того, щоб невдала спроба з'єднання з базою даних не приводила до фатальних наслідків при роботі додатка, необхідно використовувати конструкції try catch, що дозволяють адекватно реагувати на виниклу помилку. Наступний приклад демонструє можливість використання такого підходу.

try

{

con.Open();

Label1.Text = "<b>Сервер:</b>" + con.ServerVersion;

Label1.Text += "</br> <b>Соединение:</b>" + con.ToString();

}

catch (Exception ex)

{ Label1.Text = "При соединении с БД произошла ошибка";

Label1.Text += ex.Message;

}

finally

{

con.Close();

Label1.Text += "</br><b>Соединение:</b>" ;

Label1.Text += con.State.ToString();

}

Для обслуговування з'єднання з базою даних витрачаються ресурси комп'ютера, на якому виконується Web додаток. У зв'язку з цим, рекомендується відкривати з'єднання якнайпізніше, а закривати якомога раніше, відразу після того, як усі необхідні дії з об'єктами бази даних були виконані. Крім того, бажано будувати програмний код так, щоб з'єднання з базою даних закривалося при будь-якому результаті з'єднання з нею. У попередньому прикладі, код, розташований у блоці fіnally виконається при будь-якому результаті спроби підключення до неї, що гарантує звільнення ресурсів сервера не чекаючи моменту, коли пам'ять буде звільнена збирачем сміття. Результатом виконання програмних дій при вдалому встановленні зв’язку з сервером є екранна форма наступного вигляду (рис. 3.16).

 

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

 

Приклад 8. Відображення даних таблиці БД.Установлення з'єднання є необхідною умовою підключення до бази даних. Однак, підключення необхідне для того, щоб виконувати визначені команди над елементами бази. Розглянемо можливості виконання команд над джерелами даних. Одним з основних елементів з набору класів ADO.NET, здатним виконувати будь-який SQL оператор є клас Command. Для того, щоб використовувати клас Command необхідно установити тип команди, установити текст запиту SQL і прив'язати неї до з'єднання з БД. Існує 3 типи команд класу Command (табл. 3.1).

 

Табл. 3.1. Основні властивості класу Command

Тип Визначення
CommandType.Text   Виконання прямого оператора SQL, текст якого встановлюється у властивості CommandText. Це значення за замовчуванням.
CommandType. StoredProcedure Виконання збереженої процедури, ім'я якої встановлено у властивості CommandText
CommandType. TableDіrect Виконує опитування всієї таблиці бази даних, ім'я якого задається у властивості CommandText. Цей тип команди використовується для зворотної сумісності з деякими драйверами OLE DB і не підтримується постачальником даних SQL Server.

 

Приклад створення об'єкта Command для виконання SQL запиту і збереженої процедури представлений нижче.

 

SqlCommand cmd_SQL = new SqlCommand("Select * From tovar ",sqlCon);

cmd_SQL.CommandType = CommandType.Text;

SqlCommand cmd_Proc=new SqlCommand("GetGoods",sqlCon); cmd_Proc.CommandType = CommandType.StoredProcedure;

 

Об'єкт DataReader є одним з найпростіших і швидких способів одержання доступу до даних БД. У наступному прикладі демонструється спосіб відображення вмісту таблиці Товари у вигляді списку.

SqlDataReader rdr_SQL = cmd_SQL.ExecuteReader();

StringBuilder strResult = new StringBuilder("");

while (rdr_SQL.Read())

{

strResult.Append("<li>");

strResult.Append("Код товара <b>");

strResult.Append(rdr_SQL["kod_tov"]);

strResult.Append("</b>, Наименование товара <b>");

strResult.Append(rdr_SQL.GetString(1));

strResult.Append("</b>");

strResult.Append(", ГОСТ <b>");

strResult.Append(rdr_SQL.GetString(2));

strResult.Append("</b></li>");

}

rdr_SQL.Close(); Label2.Text = strResult.ToString();

 

Звертання до полів таблиці може відбуватися як по імені, так і за допомогою індексу. У випадку з індексом, необхідно застосовувати метод, що відповідає типові даних того поля, до якого відбувається звертання. Після завершення звертання до даних за допомогою об'єкта DataReader необхідно закрити модуль читання.

У даному прикладі використовується клас StrіngBuіlder, що більш ефективно працює з рядками (using System.Text). Ті ж самі операції з рядками можливі і з використанням стандартної операції конкатенації. Результат роботи програми представлений на рис. 3.17.

 

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