ASP.Net. Лекція 6. Робота з базами даних (исходники), Різне, Програмування, статті

Відомості, якими не мали в своєму розпорядженні древні, були дуже великі
Марк Твен


Лекція 5


Для того, щоб створювати цікаві web-сторінки, необхідно наповнити їх динамічним, оновлюваних змістом. Особливо необхідно це в бізнес-додатках – банківських, інтернет-магазинах і аукціонах. Важлива частина роботи, яку виконує розробник ASP.NET – це скріплення своїх сторінок з джерелами даних, відображення даних на сторінці, створення зручних засобів взаємодії в с ними.


Для зберігання даних найчастіше використовуються СУБД (системи управління базами даних). Як уже говорилося, в ASP.NET 2.0 робота з даними відбувається через ADO.NET 2.0-частину. NET, розроблена спеціально для доступу до баз даних або XML-файлів.


СУБД пройшли довгий шлях розвитку. На початку всі дані зберігали в простих (плоских) файлах. У міру збільшення обсягів даних постало питання про те, як отримати швидкий доступ до потрібної інформації. Для цього дані стали індексуватися. Інше питання – як уникнути дублювання – коли одні і ті ж дані зберігаються в різних місцях. Щоб її вирішити, була розроблена теорія нормалізації баз даних. Сьогодні потужна промислова СУБД немислима без систем захисту інформації, журналювання, транзакцій і збережених процедур.


Дані в СУБД зберігаються в таблицях . Таблиця складається з полів і записів. Запис – Одиниця зберігання даних, рядок таблиці. Наприклад, в одній записи зберігаються відомості про одну людину. Поля – Це стовпці таблиці для зберігання конкретного виду інформації. Бази даних називаються реляційними, тому що таблиці в них пов’язані певним чином.


Подання (View) створюються на основі однієї або декількох таблиць за допомогою фільтрації, об’єднання, сортування та групування.


Для наочності розглянемо ці поняття на прикладі. Свого часу я працювала з базою даних кадрів одного підприємства. Як створити таку базу? Перш за все нам потрібна таблиця для зберігання даних про співробітників.




























ID Ім’я Прізвище По батькові Дата народження Дата прийому Посада
1 Петро Васєчкіну Іванович 1965 2001 Завгосп
2 Василь Петров Сидорович 1977 2003 Програміст

і так далі. Таблиця може мати тисячі записів.


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
























ID Посади Назва посади Мінімальний оклад
1 Директор 1
2 Завгосп 10
3 Програміст 20
4 Прибиральниця 100

Числа в лівій колонці – це ключі . Вони потрібні, щоб зв’язати таблиці один з одним. У таблиці «Співробітники» тепер буде зберігатися не назва посади, а його ключ в таблиці посад. Для таблиці «Співробітники» він називається зовнішнім ключем, а для таблиці «Посади» – первинним ключем. Ключ також необхідно ввести в таблиці співробітників. Переміщення працівника на іншу посаду буде зберігатися в таблиці переміщень так.


















Переміщення
ID Співробітник Посада Призначення Дата
1235 123 10 11 20.06.06

Таблиця «Посади» пов’язана як з таблицею співробітників, так і з таблицею переміщень по своєму унікальному ключу. База даних може генерувати первинні ключі сама, автоматично додаючи значення до попереднього значенням ключа. Це називається автоінкрементірованіем. Для повної впевненості в унікальності даних в таблицях можуть тримати точний час створення запису (Timestamp) і GUI (глобальний унікальний ідентифікатор).


Цей процес називається нормалізацією. Щоб для звіту відновити інформацію про переміщення, в запиті потрібно зв’язати дані з різних таблиць.


В результаті цього запиту буде створено уявлення, яке покаже дані з взаємопов’язаних таблиць в зручній для сприйняття формі:


SELECT Employees.LastName, Employees.FirstName, Titles.Title, Titles_1.Title, Promotions.PromotionDate FROM Titles AS Titles_1 INNER JOIN ((Promotions INNER JOIN Titles ON Promotions.TitleBefore = Titles.id) INNER JOIN Employees ON Promotions.EmployeeID = Employees.EmployeeID) ON Titles_1.id = Promotions.TitleAfter;


Безліч таблиць даних, пов’язаних відносинами, складають базу даних. На сервері СУБД може зберігатися безліч баз даних.


Детальніше про теорію баз даних можна прочитати в інших курсах. Перейдемо до конкретних прикладів зв’язування з базами даних на веб-сторінках.


У кожного користувача Windows напевно є програма Access. Це однокористувальницька СУБД, в якій модель безпеки не так сильна. В одному файлі Access зберігаються як дані, так і інтерфейс в вигляді форм і звітів. Можна створювати модулі на VBA (Visual Basic for Application). Професійні розробники користуються більш потужними програмами. По «серйозності» СУБД від Microsoft йдуть в порядку – Access – FoxPro – MS SQL. MS SQL не дозволяє створювати форми, а займається зберіганням і захистом даних на професійному рівні. Visual Studio 2005 (і VWD) при інсталяції встановлює MS SQL Express. Він буде запускатися автоматично у вигляді сервісу Windows.


Для роботи з базами даних використовується мова структурованих запитів – SQL (Structured Query Language). Команди цієї мови називаються запитами. Запити служать для отримання даних, для створення і зміни структури таблиць, додавання, видалення та оновлення записів і багато чого іншого. Послідовність команд може зберігатися прямо на сервері СУБД у вигляді збереженої процедури. Потрібно намагатися завжди користуватися збереженими процедурами, а не писати команди самим. Головна їхня перевага – швидкість роботи і інкапсуляція бізнес-логіки. Зберігаються вони на сервері в уже відкомпілювався вигляді, в той час як простий переданий набір команд SQL проходить через стадію компіляції.


Для звернення до баз даних із зовнішніх програм існують спеціальні механізми. У Windows це ODBC – відкритий інтерфейс взаємодії з базами даних. Він дозволяє програмам, що працює під Windows або іншими ОС, спілкуватися з різними серверами реляційних баз даних.


Для конфігурування джерел даних на вашому комп’ютері зайдіть в Control Panel, Administrative Tools, Data Sources (ODBC).


Ми бачимо, що ODBC при наявності потрібного драйвера дозволяє зв’язуватися з різними базами даних – Access, FoxPro, Oracle, Microsoft SQL, MySQL, SAP, DB2. Якщо у файлі Excel створити іменованих таблицю, ODBC здатен її розпізнати і працювати як з таблицею бази даних.


Веб-проект в Visual Studio 2005 містить зумовлену папку App_Data. У ній можуть зберігатися файли з даними, які використовуються в додатку. Це можуть бути файли. Mdf (MS SQL),. Mdb (Microsoft Access), . Xml та інші.


ADO.NET 2.0


ADO.NET – це набір класів для роботи з зовнішніми даними. У новій версії. NET 2.0 він був розширений новими властивостями і тожет отримав номер 2.0.


З’єднання в ADO.NET може відбуватися за допомогою різних провайдерів. В даний час рекомендується працювати з допомогою провайдера MS SQL або Oracle. Ці провайдер самі написані на керованому коді. NET. Ще один провайдер OleDb, дозволяє отримати доступ до інших джерел даних – Access, Excel, MySql, SAP. Провайдер OleDb написаний на некерованому коді, але може працювати разом з. NET.


Класи ADO.NET об’єднані в кілька просторів імен.


System.Data – це ядро ​​ADO.NET. Воно містить класи, необхідні для зв’язку за допомогою будь-яких провайдерів даних. Ці класи представляють таблиці, рядки, стовпці, DataSet (безліч взаємопов’язаних таблиць). Там визначені інтерфейси (в сенсі мови C #) з’єднань з базами даних, команд, адаптерів даних.


System.Data.Common – базові класи для всіх провайдерів даних – DbConnection, DbCommand, DbDataAdapter.


В System.Data.OleDb знаходяться класи, що дозволяють працювати з джерелами даних OleDb, в тому числі з MS SQL версії 6.0 і нижче. Там знаходяться такі класи, як OleDbConnection, OleDbDataAdapter і OleDbCommand.


System.Data.Odbc містить класи, які працюють з джерелами даних ODBC за допомогою провайдера. NET ODBC. Класи мають аналогічні імена з префіксом Odbc.


System.Data.SqlClient. Тут визначено провайдер даних для СУБД SQL Server версії 7.0 і вище. Містяться класи SqlConnection, SqlTransaction, SqlCommand та інші.


В System.Data.SqlTypes знаходяться класи, що представляють типи даних СУБД SQL Server.


Класи ADO.NET діляться на 3 типи. Класи типу Disconnected визначають базову структуру даних, наприклад DataTable. Вони незалежні від будь-яких провайдерів даних і можуть створюватися і заселятися даними безпосередньо в програмі. Класи Shared базові та загальні для всіх провайдерів. Класи Data Provider специфічні для різних провайдерів.


Програмування ADO.NET


Всі провайдери даних містять класи сполук, адаптерів, команд. Схема типової програми в ADO.NET така.



  1. Спочатку створюється з’єднання з базою даних – клас Connection, що забезпечується необхідною інформацією – рядком з’єднання.
  2. Створюється об’єкт Command і задається команда, яку необхідно виконати в даній СУБД. Ця команда може бути запитом SQL або виконуваній процедурою. Потрібно задати параметри цієї команди, якщо вони є.
  3. Якщо команда не повертає даних, вона просто виконується за допомогою одного з методів Execute. Наприклад, це може бути видалення або оновлення даних таблиці.
  4. Якщо команда повертає вибірку даних, їх необхідно кудись помістити. Вирішити, чи потрібно вам отримати дані для подальшого використання без зв’язку з базою даних або ж потрібно просто швидко виконати команду. У першому випадку потрібно створити клас DataAdapter і з його допомогою зберегти дані в DataSet або в DataTable. У другому випадку створюється клас DataReader, який вимагає зберігати з’єднання на весь час роботи, зберігає вибірку тільки для читання і дозволяє рухатися тільки вперед. Зате читання за допомогою DataReader виконується в кілька разів швидше, ніж в DataAdapter.
  5. Поставити отриманий DataSet або DataReader як джерело даних елемента керування або вивести їх на сторінку іншим способом.

Об’єкт Connection


Об’єкт Connection для з’єднання з базою даних потребує рядку з’єднання для вказівки шляху до СУБД і входу в систему. Властивості класу Connection показані в таблиці. OleDbConnection, SqlConnection, OdbcConnection – Спадкоємці класу Connection, специфічні для провайдерів OleDb, MS SQL ODBC відповідно.



















Властивість Опис
DataSource Шлях до бази даних у файловій системі при використанні Oledb, ім’я екземпляра бази сервера при використанні SqlConnection
Database Повертає ім’я бази даних, яка використовується в об’єкті Connection після відкриття
State Повертає поточний стан з’єднання. Можливі значення – Broken, Closed, Connecting, Executing, Fetching і Open.
ConnectionString Рядок з’єднання з СУБД

Всі властивості, крім ConnectionString, тільки для читання.


Використання об’єкта Command


Об’єкт Command виконує запит SQL, який може бути у формі вбудованого тексту, процедури сервера або прямого доступу до таблиці. Якщо це запит на вибірку даних SELECT, то дані зазвичай розміщуються в DataSet або в DataReader. Методи і властивості визначені в абстрактному класі DbCommand (через інтерфейс IDbCommand), і їх реалізують приватні неуспадковане класи OleDbCommand, SqlCommand, OdbcCommand.


Властивість CommandType може приймати значення з перерахування CommandType. За замовчуванням це Text, тобто виконується безпосередньо текст команди SQL, який записаний у властивості Command. TableDirect означає, що в результаті виконання команди буде повернуто весь зміст таблиці. StoredProcedure означає, що в Command знаходиться ім’я процедури сервера, яка і буде виконуватися.


Властивість CommandText зберігає текст запиту SQL або ім’я серверної процедури.


CommandTimeout задає час очікування відповіді, за замовчуванням дорівнює 30 секунд. Якщо команда не виконається протягом цього часу, буде викинуто виключення.


Процедури сервера потребують параметрах. Вони зберігаються в колекції Parameters і мають тип SqlParameter. Текстові команди також можуть отримувати параметри, перед якими ставиться префікс @. Наприклад:






  SELECT * FROM CUSTOMERS WHERE CITY = @CITY AND CONTACTNAME = @CONTACT

Часто використовується метод ExecuteNonQuery. За допомогою нього можна виконати будь-яку операцію з базами даних, яка не пов’язана із запитом та отриманням даних, як то оновлення, видалення записів, створення і зміна таблиць, створення процедур сервера. Вона повертає кількість змінених записів в тому випадку, якщо виконуються команди Select, Update, Delete.


ExecuteScalar повертає результат запиту у випадку, якщо це одне-єдине значення. Наприклад, потрібно дізнатися кількість замовлень конкретного покупця. Запит виконується за допомогою команди “Select count * Where customerid = 1 “. Її результат – вибірка з одного рядка і одного стовпця. Її можна виконати і за допомогою методу ExecuteReader, але ExecuteScalar буде виконуватися швидше. Якщо запит поверне більше кількість рядків або стовпців, вони будуть проігноровані.


ExecuteRow повертає єдину запис.


ExecuteReader виконується, якщо потрібно отримати табличні дані. Результат виконання – курсор, в якому можна рухатися тільки від початку до кінця.


В результаті виконання методу ExecuteReader об’єкта Command створюється об’єкт DataReader. Завжди закривайте з’єднання після використання, інакше воно залишиться активним і буде займати ресурси. Це можна зробити двома способами. Перший – викликати перевантажений метод ExecuteReader, який приймає параметр типу CommandBehavior зі значенням CommandBehavior.CloseConnection. В такому випадку необхідно перегорнути отриману вибірку від початку до кінця, і з’єднання закриється, коли буде досягнутий кінець. Якщо ви не хочете прочитати всі дані, можете самостійно закрити з’єднання методом Close.






    public void CreateMySqlDataReader(string mySelectQuery, string myConnectionString)
  {
    SqlConnection myConnection = new SqlConnection(myConnectionString);
    SqlCommand myCommand = new SqlCommand(mySelectQuery, myConnection);
    myCommand.CommandType = CommandType.Text;
    myCommand.Connection.Open();
    SqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
    while (myReader.Read())
    {
      Response.Write(myReader.GetString(0) + “<br>”);
    }
    myReader.Close();
    myConnection.Close();
  }

Розвинені СУБД (тепер і MS Access) підтримують транзакції. Транзакція – це послідовність команд, яка виконується як одне ціле. Наприклад, при перекладі грошей сума віднімається з одного рахунку і додається до іншого. Якщо відбудеться тільки одна з цих операцій, банк або його клієнти понесуть втрати. тому важливо, щоб відбулися обидві операції або б ні одна не відбулася. Якщо на одному з етапів транзакції сталася помилка, відбувається відкат (Rollback), тобто скасовуються всі раніше зроблені операції та база повертається до стану до початку транзакції. Якщо все успішно, транзакція підтверджується операцією Commit.


Для підтримки транзакцій введений клас SqlTransaction і йому подібні. В об’єкта Command є властивість Transaction. Метод BeginTransaction об’єкта Connection змушує базу даних перейти в режим транзакції.


Крім того, необхідно завжди укладати програмний код, який працює з базами даних, в блоки try / catch, так як робота часто відбувається з віддаленими серверами, і можуть відбуватися самі різні помилки як в мережі. так і при роботі самого сервера.


При цьому викидається виключення SqlException або OleDbException.






    public void RunTransaction(string[] Queries, string myConnectionString)
  {
    SqlConnection conn = null;
    SqlTransaction trans = null;
    try
    {
      conn = new SqlConnection(myConnectionString);
      conn.Open();
      trans = conn.BeginTransaction();
      SqlCommand cmd = new SqlCommand();
      cmd.Connection = conn;
      cmd.Transaction = trans;
      foreach (string Query in Queries)
      {
        cmd.CommandText = Query;
        cmd.ExecuteNonQuery();
      }
      trans.Commit();
    }
    catch (SqlException SqlEx)
    {
      if (trans != null)
      {
        trans.Rollback();
      }
      throw new Exception(“An error occurred while transaction”, SqlEx);
      return;
    }
    finally
    {
      if (conn != null)
      {
        conn.Close();
      }
    }
  }

DataAdapter


DbDataAdapter є батьківським класом для SqlDataAdapter, OleDbDataAdapter, OdbcDataAdapter. Цей клас містить 4 об’єкта типу Command. Класи DataAdapter забезпечують двосторонній обмін інформацією.



Метод Fill класу DbDataAdapter заповнює об’єкти DataSet або DataTable даними, прочитаними в результаті виконання команди SelectCommand. Ця команда повинна бути запитом SQL типу Select. Якщо таблиці вже існують, до нього додаються нові таблиці. Взагалі метод Fill перевантажений 8 разів. Наприклад, DbDataAdapter.Fill Method (DataSet, String) додає в DataSet таблицю з ім’ям, зазначеним у другому параметрі. Якщо така таблиця вже є, вона оновлюється. Доступ до таблиці можна отримати за допомогою його імені индексатором.






  DataTable tblProducts = data.Tables[“Products”];

Метод DbDataAdapter.Update записує в базу даних всі зміни, які відбулися у зв’язаному з ним об’єкті DataSet.


DataSet


DataSet – це клас, який містить в собі одну або кілька таблиць DataTable і зв’язки між ними. Клас DataSet – це подання в пам’яті інформації, ліченої через ADO з баз даних або XML. Він дозволяє маніпулювати даними після відключення від джерела даних.


Колекція таблиць зберігається у властивості Tables, а відносин – у властивості Relations.


Грунтуючись на таблицях датасета, можна створювати вистави – DataView.


Напишемо сторінку, в якій будуть використовуватися представлені класи.


База Northwind входить в комплект SDK. Її можна встановити на сервері, запустивши командний рядок SQLExpress.






  sqlcmd -E -S (local)SQLExpress -i InstNwnd.sql





  <%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx.cs” Inherits=”_Default” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”> Робота з базою </ title><br />     </head><br />     <body><br />       <form id=”Form1″ runat=”server”><br />         <asp:DropDownList ID=”DropDownList1″ runat=”server”><br />         </asp:DropDownList><br />         <asp:DataGrid id=”DataGrid1″ runat=”server”></asp:DataGrid><br />         </form><br />     </body><br /> </html><br /> </PRE></TD></TR></TBODY></TABLE><br /> <P><br /> <TABLE class=borderall cellSpacing=0 cellPadding=2 bgColor=#d8d8d8><br /> <TBODY><br /> <TR><br /> <TD><PRE> Файл з кодом:<br /> using System;<br /> using System.Data;<br /> using System.Web;<br /> using System.Web.UI;<br /> using System.Web.UI.WebControls;<br /> using System.Data.SqlClient;<br /> public partial class _Default : System.Web.UI.Page<br /> {<br />     protected void Page_Load(object sender, EventArgs e)<br />     {<br />         String strConnect;<br />         String strCommand;<br />         strConnect = @”Data Source=.SQLExpress;Initial Catalog=Northwind;Integrated Security=True”;<br />         SqlConnection myConn = new SqlConnection(strConnect);<br />         strCommand = “SELECT CategoryName, CategoryID FROM Categories”;<br />         SqlDataAdapter myData = new SqlDataAdapter(strCommand, myConn);<br />         DataSet DataSet1 = new DataSet();<br />         myData.Fill(DataSet1, “Categories”);<br />         strCommand = “SELECT ProductName, UnitPrice, CategoryID FROM Products”;<br />         myData.SelectCommand.CommandText = strCommand;<br />         myData.Fill(DataSet1, “Products”);<br />         DataSet1.Relations.Add(DataSet1.Tables[0].Columns[“CategoryID”], DataSet1.Tables[1].Columns[“CategoryID”]);<br />         DataView myView = new DataView(DataSet1.Tables[“Products”], “”, “ProductName”, DataViewRowState.CurrentRows);<br />         DataGrid1.DataSource = myView;<br />         DataGrid1.DataBind();<br />         DropDownList1.DataSource = DataSet1.Tables[0];<br />         DropDownList1.DataTextField = “CategoryName”;<br />         DropDownList1.DataValueField = “CategoryID”;<br />         DropDownList1.DataBind();<br />         myConn.Close();<br />     }<br /> }<br /> </PRE></TD></TR></TBODY></TABLE><br /> <H3>Вікно зовнішніх джерел даних.</H3><br /> <P>У Visual Studio 2005 існує 3 вкладки перегляду проектів: Solution Explorer, Class Explorer, Server Explorer. Першими двома активно користувалися всі, хто писав програми на C # (або іншою мовою), а третій за замовчуванням не видно, відкрийте його з меню View-> Server Explorer. Це вікно дозволяє працювати із з’єднаннями баз даних, переглядати статистику роботи сервера (В VWD Express немає пункту Servers).</P></p> <p></a></P><br /> <P>При бажанні на цьому кроці можна відсортувати значення, наприклад, за алфавітним порядком текстів натисканням на кнопку ORDER BY. На передостанньому кроці можна протестувати отриманий запит, якщо все в порядку, то на останньому кроці ставимо variant як джерело для показу і id для значень. На сторінці повинно вийти приблизно наступне:</P><br /> <P><br /> <TABLE class=borderall cellSpacing=0 cellPadding=2 bgColor=#d8d8d8><br /> <TBODY><br /> <TR><br /> <TD><PRE> <%@ Page Language=”C#” AutoEventWireup=”true”  CodeFile=”Voting.aspx.cs” Inherits=”Voting” %><br /> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”><br /> <html xmlns=”http://www.w3.org/1999/xhtml” ><br /> <head> <title> Голосування для програмістів </ title><br /> </head><br /> <body><br /> <br /><br /> Яка мова програмування Ви віддаєте перевагу? <br /> <br /> <form runat=”server” id=”voting”><br />     <asp:RadioButtonList ID=”RadioButtonList1″ runat=”server” DataSourceID=”SqlDataSource1″ DataTextField=”variant” DataValueField=”id”><br />     </asp:RadioButtonList><br /> <asp:SqlDataSource ID=”SqlDataSource1″ runat=”server” ConnectionString=”<%$ ConnectionStrings:PollsConnectionString %>”<br />         SelectCommand=”SELECT [id], [variant] FROM [poll] ORDER BY [variant] “></asp:SqlDataSource><br />     <br /><br />         <br /><br />      <asp:Button ID=”Button1″ runat=”server” Text=”Button” /><br /><br /> <br /><br /> <br /><br /><br /> </form><br /> <asp:Label id=”Message” runat=”server” /><br /> </body><br /> </html><br /> </PRE></TD></TR></TBODY></TABLE><br /> <P>6. Обробка результатів. Процедуру необхідно викликати за параметром, узятим з властивості Value групи перемикачів. Властивість Parameters SqlCommand є колекцією, в даному випадку в неї треба додати один елемент.</P><br /> <P><br /> <TABLE class=borderall cellSpacing=0 cellPadding=2 bgColor=#d8d8d8><br /> <TBODY><br /> <TR><br /> <TD><PRE> public partial class Voting : System.Web.UI.Page<br /> {<br />     public void ExecuteStoredProcedure(string ProcedureName, string myConnectionString, int id)<br />     {<br />         SqlConnection myConnection = new SqlConnection(myConnectionString);<br />         SqlCommand myCommand = new SqlCommand(ProcedureName, myConnection);<br />         myCommand.CommandType = CommandType.StoredProcedure;<br />         SqlParameter myParm = myCommand.Parameters.Add(“@choiceid”, SqlDbType.Int, 4);<br />         myParm.Value = id;<br />         myCommand.Connection.Open();<br />         myCommand.ExecuteNonQuery();<br />         myConnection.Close();<br />     }<br />     protected void Page_Load(object sender, EventArgs e)<br />     {<br />         String strConnection = “Data Source=.SQLEXPRESS;Initial Catalog=Polls;Integrated Security=True”;<br />         if (Page.IsPostBack)<br />         {<br />             String strProc=”CountVote”;<br />             Message.Text = RadioButtonList1.SelectedValue;<br />             ExecuteStoredProcedure(strProc, strConnection, Int32.Parse(RadioButtonList1.SelectedValue) );<br />         }<br />     }<br /> }<br /> </PRE></TD></TR></TBODY></TABLE><br /> <P>При роботі з базами даних важливо дотримуватися принципу: «займай ресурси якомога пізніше і звільняй якомога раніше». Тому з’єднання закривається відразу після виконання процедури сервера.</P><br /> <H2>Висновок</H2><br /> <P>Робота з базами даних в ASP.NET – настільки велика тема, що її неможливо охопити в одній лекції. Хоча класи ADO.NET інкапсульовані в більш зручні класи джерел даних, їх необхідно знати, щоб краще зрозуміти нову модель, прийняту в ASP. NET 2.0.</P><br /></p> <div class="ad-top2"> <!-- Top article #956715 --> <script>(function(e){var t="DIV_DA_"+e+"_"+parseInt(Math.random()*1e3); document.write('<div id="'+t+'" class="directadvert-block directadvert-block-'+e+'"></div>'); if("undefined"===typeof loaded_blocks_directadvert){loaded_blocks_directadvert=[]; function n(){var e=loaded_blocks_directadvert.shift(); var t=e.adp_id; var r=e.div; var i=document.createElement("script"); i.type="text/javascript"; i.async=true; i.charset="windows-1251"; i.src="//code.directadvert.ru/data/"+t+".js?async=1&div="+r+"&t="+Math.random(); var s=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]; s.appendChild(i); var o=setInterval(function(){if(document.getElementById(r).innerHTML&&loaded_blocks_directadvert.length){n(); clearInterval(o)}},50)} setTimeout(n)}loaded_blocks_directadvert.push({adp_id:e,div:t})})(956715)</script> </div> <div style="float:right"> <div class="yashare-auto-init" data-yashareL10n="ua" data-yashareType="icon" data-yashareQuickServices="yaru,vkontakte,facebook,twitter,odnoklassniki,moimir,lj,moikrug,gplus"></div> </div> <h4>Схожі статті:</h4><ul><li><a href="http://easy-code.com.ua/2010/10/serverni-skripti-vvedennya/" title="Серверні скрипти. Введення">Серверні скрипти. Введення</a> (0)</li><li><a href="http://easy-code.com.ua/2011/01/pamyatka-po-css/" title="Пам'ятка по CSS">Пам'ятка по CSS</a> (0)</li><li><a href="http://easy-code.com.ua/2010/10/vvedennya-v-cookies/" title="Введення в Cookies.">Введення в Cookies.</a> (0)</li><li><a href="http://easy-code.com.ua/2010/11/vvedennya-v-cookies-2/" title="Введення в Cookies.">Введення в Cookies.</a> (0)</li><li><a href="http://easy-code.com.ua/2011/02/gorizontalne-i-vertikalne-centruvannya-kontejnera/" title="Горизонтальне і вертикальне центрування контейнера">Горизонтальне і вертикальне центрування контейнера</a> (0)</li><li><a href="http://easy-code.com.ua/2011/02/19-monitori-stayut-vse-bilsh-privablivimi/" title="19 "монітори стають все більш привабливими">19 "монітори стають все більш привабливими</a> (0)</li><li><a href="http://easy-code.com.ua/2011/02/3d-printing-druk-abo-skulptura/" title="3D-printing: друк або скульптура?">3D-printing: друк або скульптура?</a> (0)</li></ul> <!--for paginate posts--> <hr/> <p><strong><em> Сподобалася стаття? Ви можете <a href="#comments"> залишити відгук </a> або <a href = "http://easy-code.com.ua/feed/" > підписатися на RSS </a>, щоб автоматично отримувати інформацію про нові статтях. </em></strong></p> <!--Post Meta--> <div class="post-meta"> <strong>Метки: </strong><a href="http://easy-code.com.ua/tag/system/" rel="tag">System</a>, <a href="http://easy-code.com.ua/tag/13495/" rel="tag">       </a>, <a href="http://easy-code.com.ua/tag/yednannya/" rel="tag">єднання</a>, <a href="http://easy-code.com.ua/tag/bazami/" rel="tag">базами</a>, <a href="http://easy-code.com.ua/tag/dopomogoyu/" rel="tag">допомогою</a>, <a href="http://easy-code.com.ua/tag/neobxidno/" rel="tag">необхідно</a>, <a href="http://easy-code.com.ua/tag/tablici/" rel="tag">таблиці</a><br /> <strong>Рубрики:</strong> <a href="http://easy-code.com.ua/category/rizne/" rel="category tag">Різне</a> </div> <!--include comments template--> <div id="comments-wrap"> <p>Коментарів поки що немає.</p> <!-- <p><a href="http://easy-code.com.ua/2012/09/asp-net-lekciya-6-robota-z-bazami-danix-isxodniki-rizne-programuvannya-statti/feed/">RSS-стрічка коментарів.</a> <a href="http://easy-code.com.ua/2012/09/asp-net-lekciya-6-robota-z-bazami-danix-isxodniki-rizne-programuvannya-statti/trackback/" rel="trackback">Адреса для трекбек</a> </p> --> <h3 class="postcomment">Ваш отзыв</h3> <p>Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <code><a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> </code></p> <form action="http://easy-code.com.ua/wp-comments-post.php" method="post" id="commentform"> <p> <input type="text" name="author" id="author" class="textarea" value="" size="28" tabindex="1" /> <label for="author">Им'я</label> * </p> <p> <input type="text" name="email" id="email" value="" size="28" tabindex="2" /> <label for="email">E-mail</label> * </p> <p> <input type="text" name="url" id="url" value="" size="28" tabindex="3" /> <label for="url">Сайт</label> </p> <p> <label for="comment">Повідомлення</label> <br /> <textarea name="comment" id="comment" cols="60" rows="10" tabindex="4"></textarea> </p> <p> <input name="submit" id="submit" type="submit" tabindex="5" value="відправити" /> <input type="hidden" name="comment_post_ID" value="17353" /> <input type="hidden" name="redirect_to" value="/2012/09/asp-net-lekciya-6-robota-z-bazami-danix-isxodniki-rizne-programuvannya-statti/" /> </p> <p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="3713363cd1" /></p><p style="display: none;"><input type="hidden" id="ak_js" name="ak_js" value="146"/></p></form> </div> <!--do not delete--> <!--single.php end--> </div> <!--include sidebar--> <!--sidebar.php--> <div id="sidebar"> <div class="sidebar-rss"> <h3>Подписка через RSS</h3> <p><a href="http://easy-code.com.ua/feed/"><img src="http://easy-code.com.ua/wp-content/themes/elegantblue/images/rss.jpg" alt="Подписка на RSS" ></img></a>Якщо вам сподобалася інформація на нашому сайті, ви можете підписатися на оновлення через RSS.</p> </div> <BR> <div class="something"> <a href='http://easy-code.com.ua/tag/download/' class='tag-link-563 tag-link-position-1' title='648 topics' style='font-size: 12.328358208955pt;'>Download</a> <a href='http://easy-code.com.ua/tag/microsoft/' class='tag-link-66 tag-link-position-2' title='772 topics' style='font-size: 13.522388059701pt;'>Microsoft</a> <a href='http://easy-code.com.ua/tag/oracle/' class='tag-link-18322 tag-link-position-3' title='357 topics' style='font-size: 8.4477611940299pt;'>Oracle</a> <a href='http://easy-code.com.ua/tag/windows/' class='tag-link-18319 tag-link-position-4' title='1,383 topics' style='font-size: 17.253731343284pt;'>Windows</a> <a href='http://easy-code.com.ua/tag/internet/' class='tag-link-132 tag-link-position-5' title='366 topics' style='font-size: 8.5970149253731pt;'>Інтернет</a> <a href='http://easy-code.com.ua/tag/merezhi/' class='tag-link-143 tag-link-position-6' title='438 topics' style='font-size: 9.7910447761194pt;'>Мережі</a> <a href='http://easy-code.com.ua/tag/modeli/' class='tag-link-530 tag-link-position-7' title='360 topics' style='font-size: 8.5970149253731pt;'>моделі</a> <a href='http://easy-code.com.ua/tag/mozhete/' class='tag-link-3 tag-link-position-8' title='569 topics' style='font-size: 11.582089552239pt;'>можете</a> <a href='http://easy-code.com.ua/tag/mozhut/' class='tag-link-311 tag-link-position-9' title='384 topics' style='font-size: 9.044776119403pt;'>можуть</a> <a href='http://easy-code.com.ua/tag/dopomogoyu/' class='tag-link-273 tag-link-position-10' title='731 topics' style='font-size: 13.074626865672pt;'>допомогою</a> <a href='http://easy-code.com.ua/tag/dozvolyaye/' class='tag-link-542 tag-link-position-11' title='664 topics' style='font-size: 12.477611940299pt;'>дозволяє</a> <a href='http://easy-code.com.ua/tag/kompani%d1%97/' class='tag-link-554 tag-link-position-12' title='546 topics' style='font-size: 11.283582089552pt;'>компанії</a> <a href='http://easy-code.com.ua/tag/koristuvachiv/' class='tag-link-137 tag-link-position-13' title='337 topics' style='font-size: 8.1492537313433pt;'>користувачів</a> <a href='http://easy-code.com.ua/tag/potribno/' class='tag-link-18 tag-link-position-14' title='566 topics' style='font-size: 11.432835820896pt;'>потрібно</a> <a href='http://easy-code.com.ua/tag/programi/' class='tag-link-387 tag-link-position-15' title='1,547 topics' style='font-size: 18pt;'>програми</a> <a href='http://easy-code.com.ua/tag/prosto/' class='tag-link-99 tag-link-position-16' title='328 topics' style='font-size: 8pt;'>просто</a> <a href='http://easy-code.com.ua/tag/vikoristannya/' class='tag-link-690 tag-link-position-17' title='368 topics' style='font-size: 8.7462686567164pt;'>використання</a> <a href='http://easy-code.com.ua/tag/vikoristovuvati/' class='tag-link-890 tag-link-position-18' title='427 topics' style='font-size: 9.6417910447761pt;'>використовувати</a> <a href='http://easy-code.com.ua/tag/znachennya/' class='tag-link-198 tag-link-position-19' title='1,003 topics' style='font-size: 15.164179104478pt;'>значення</a> <a href='http://easy-code.com.ua/tag/roboti/' class='tag-link-123 tag-link-position-20' title='1,104 topics' style='font-size: 15.761194029851pt;'>роботи</a> <a href='http://easy-code.com.ua/tag/rozrobki/' class='tag-link-1235 tag-link-position-21' title='328 topics' style='font-size: 8pt;'>розробки</a> <a href='http://easy-code.com.ua/tag/sistemi/' class='tag-link-476 tag-link-position-22' title='1,131 topics' style='font-size: 15.910447761194pt;'>системи</a> <a href='http://easy-code.com.ua/tag/upravlinnya/' class='tag-link-556 tag-link-position-23' title='760 topics' style='font-size: 13.373134328358pt;'>управління</a> <a href='http://easy-code.com.ua/tag/server/' class='tag-link-197 tag-link-position-24' title='650 topics' style='font-size: 12.328358208955pt;'>сервер</a> <a href='http://easy-code.com.ua/tag/stvorennya/' class='tag-link-439 tag-link-position-25' title='460 topics' style='font-size: 10.089552238806pt;'>створення</a> <a href='http://easy-code.com.ua/tag/tablici/' class='tag-link-496 tag-link-position-26' title='469 topics' style='font-size: 10.238805970149pt;'>таблиці</a> <a href='http://easy-code.com.ua/tag/tilki/' class='tag-link-6 tag-link-position-27' title='1,295 topics' style='font-size: 16.805970149254pt;'>тільки</a> <a href='http://easy-code.com.ua/tag/fajliv/' class='tag-link-293 tag-link-position-28' title='410 topics' style='font-size: 9.3432835820896pt;'>файлів</a> <a href='http://easy-code.com.ua/tag/funkci%d1%97/' class='tag-link-218 tag-link-position-29' title='439 topics' style='font-size: 9.7910447761194pt;'>функції</a> <a href='http://easy-code.com.ua/tag/informaci%d1%97/' class='tag-link-24 tag-link-position-30' title='368 topics' style='font-size: 8.7462686567164pt;'>інформації</a></div> <!--l_sidebar.php--> <div id="l_sidebar"> <ul> <br> <!--favorite posts--> <li> <h2>Нове на сайті</h2> <ul> <li><a href='http://easy-code.com.ua/2015/11/keruyuchi-klavishi-i-menyu-informix/'>Керуючі клавіші і меню INFORMIХ</a></li> <li><a href='http://easy-code.com.ua/2015/10/vipushheno-reliz-fastreport-fmx/'>Випущено реліз FastReport FMX</a></li> <li><a href='http://easy-code.com.ua/2015/10/oracle/'>Oracle</a></li> <li><a href='http://easy-code.com.ua/2015/09/func-hgi-35i-vertolit-z-keruvannyam-vid-iphone/'>Func HGI-35i: вертоліт з керуванням від iPhone</a></li> <li><a href='http://easy-code.com.ua/2015/08/faq-po-grafiku-i-animaciyu-dlya-web/'>FAQ по графіку і анімацію для Web</a></li> <li><a href='http://easy-code.com.ua/2015/07/funkciya-viznachennya-kilkosti-robochix-dniv/'>Функція визначення кількості робочих днів</a></li> <li><a href='http://easy-code.com.ua/2015/07/inshi-mozhlivosti-obyednannya-fajliv/'>Інші можливості об’єднання файлів</a></li> <li><a href='http://easy-code.com.ua/2015/07/oglyad-navushnikiv-z-aktivnim-shumozaglushennyam-asus-nc1/'>Огляд навушників з активним шумозаглушенням ASUS NC1</a></li> <li><a href='http://easy-code.com.ua/2015/06/net-service-oriented-architecture-soa/'>.NET: Service Oriented Architecture (SOA)</a></li> <li><a href='http://easy-code.com.ua/2015/06/oglyad-behold-betab-7004/'>Огляд Behold BeTAB 7004</a></li> </ul> </li> <li> <h2>Реклама</h2> <ul> <div class="adcontentcen1"> <!-- Sidebar 160x600 #956693 --> <script>(function(e){var t="DIV_DA_"+e+"_"+parseInt(Math.random()*1e3); document.write('<div id="'+t+'" class="directadvert-block directadvert-block-'+e+'"></div>'); if("undefined"===typeof loaded_blocks_directadvert){loaded_blocks_directadvert=[]; function n(){var e=loaded_blocks_directadvert.shift(); var t=e.adp_id; var r=e.div; var i=document.createElement("script"); i.type="text/javascript"; i.async=true; i.charset="windows-1251"; i.src="//code.directadvert.ru/data/"+t+".js?async=1&div="+r+"&t="+Math.random(); var s=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]; s.appendChild(i); var o=setInterval(function(){if(document.getElementById(r).innerHTML&&loaded_blocks_directadvert.length){n(); clearInterval(o)}},50)} setTimeout(n)}loaded_blocks_directadvert.push({adp_id:e,div:t})})(956693)</script> </div> </ul> </li> </ul> </div> <!--l_sidebar.php end--> <!--r_sidebar.php--> <div id="r_sidebar"> <ul> <br> <li> <h2>Популярне</h2> <ul> <!-- 2017-08-18 19:20:04 --> <li><a href="http://easy-code.com.ua/2011/04/avtomatizaciya-biznes-procesiv-svitle-majbutnye-vitchiznyanix-kompanij/">Автоматизація бізнес-процесів – світле майбутнє вітчизняних компаній (13)</a></li> <li><a href="http://easy-code.com.ua/2012/08/nalashtuvannya-ekrannix-zastavok-v-windows-7-za-dopomogoyu-reyestru-windows-operacijni-sistemi-statti/">Налаштування екранних заставок в Windows 7 за допомогою реєстру, Windows, Операційні системи, статті (14)</a></li> <li><a href="http://easy-code.com.ua/2011/01/recenzuvannya-dokumentiv-u-word/">Рецензування документів у Word (9)</a></li> <li><a href="http://easy-code.com.ua/2012/08/suputnikovij-internet-ta-telebachennya-na-noutbuci-za-dopomogoyu-prof-dvb-s-1100-usb-gadzheti-oglyadi/">Супутниковий інтернет та телебачення на ноутбуці за допомогою Prof DVB-S 1100 USB, Гаджети, огляди (14)</a></li> <li><a href="http://easy-code.com.ua/2014/07/kalkulyator-teplotexnichnij-rozraxunok/">Калькулятор «Теплотехнічний розрахунок» (17)</a></li> <li><a href="http://easy-code.com.ua/2014/11/pereklad-pdf-dokumentiv-za-dopomogoyu-google-translate/">Переклад PDF-документів за допомогою Google Translate (9)</a></li> <li><a href="http://easy-code.com.ua/2012/06/formatuvannya-abzaciv-u-word-2010-ms-office-programni-kerivnictva-statti/">Форматування абзаців у Word 2010, MS Office, Програмні керівництва, статті (28)</a></li> <li><a href="http://easy-code.com.ua/2012/08/gibernaciya-son-i-gibridnij-splyachij-rezhim-v-windows-7-pitannya-i-vidpovidi-windows-operacijni-sistemi-statti/">Гібернація, сон і гібридний сплячий режим в Windows 7 – питання і відповіді, Windows, Операційні системи, статті (12)</a></li> <li><a href="http://easy-code.com.ua/2011/02/ustanovka-movnix-paketiv-windows-7-vruchnu/">Установка мовних пакетів Windows 7 вручну (8)</a></li> <li><a href="http://easy-code.com.ua/2011/03/serverni-operacijni-sistemi-providnix-virobnikiv/">Серверні операційні системи провідних виробників (10)</a></li> <li><a href="http://easy-code.com.ua/2011/10/suputnikovij-internet-bez-tarilki-efirne-cifrove-movlennya-za-standartom-dvb-t-gadzheti-oglyadi/">Супутниковий інтернет без тарілки – ефірне цифрове мовлення за стандартом DVB-T, Гаджети, огляди (8)</a></li> <li><a href="http://easy-code.com.ua/2012/09/uroki-photoshop-yak-pokrashhiti-foto-znyate-na-mobilnik-fotoobroblennya-programi-dlya-roboti-z-grafikoyu-programni-kerivnictva-statti/">Уроки Photoshop: Як покращити фото зняте на мобільник, фотооброблення, Програми для роботи з графікою, Програмні керівництва, статті (8)</a></li> <!-- 2017-08-18 19:20:04 --></ul> </li> </ul> </div> <!--r_sidebar.php end--> </div> <!--sidebar.php end--><!--include footer--> </div> <div id="footer"> <p> При використанні матеріалів даного сайту пряме і явне посилання на сайт <a href="http://www.easy-code.com.ua/"> www.easy-code.com.ua </a> є обов'язковим. </p> <!--footer.php--> <div id="footer-wrap"> <noindex> <!--LiveInternet counter--><script type="text/javascript"><!-- document.write("<a href='http://www.liveinternet.ru/click' "+ "target=_blank><img src='//counter.yadro.ru/hit?t19.6;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+ ";"+Math.random()+ "' alt='' title='LiveInternet: показано число просмотров за 24"+ " часа, посетителей за 24 часа и за сегодня' "+ "border='0' width='88' height='31'><\/a>") //--></script><!--/LiveInternet--> <!-- Yandex.Metrika counter --> <div style="display:none;"><script type="text/javascript"> (function(w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter10604395 = new Ya.Metrika({id:10604395, enableAll: true}); } catch(e) { } }); })(window, "yandex_metrika_callbacks"); </script></div> <script src="//mc.yandex.ru/metrika/watch.js" type="text/javascript" defer="defer"></script> <noscript><div><img src="//mc.yandex.ru/watch/10604395" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <script type="text/javascript" src="//yandex.st/share/share.js" charset="utf-8"></script> <script type="text/javascript" src="https://apis.google.com/js/plusone.js"> {lang: 'ru'} </script> </noindex> <BR><strong>ЕasyСode</strong> <!--necessary--> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/akismet/_inc/form.js?ver=3.3'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-includes/js/wp-embed.min.js?ver=4.7.5'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-includes/js/jquery/jquery.js?ver=1.12.4'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/easy-fancybox/fancybox/jquery.fancybox-1.3.8.min.js?ver=1.5.8.2'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/easy-fancybox/js/jquery.easing.min.js?ver=1.3.2'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/easy-fancybox/js/jquery.mousewheel.min.js?ver=3.1.12'></script> <script type="text/javascript"> jQuery(document).on('ready post-load', function(){ jQuery('.nofancybox,a.pin-it-button,a[href*="pinterest.com/pin/create/button"]').addClass('nolightbox'); }); jQuery(document).on('ready post-load',easy_fancybox_handler); jQuery(document).on('ready',easy_fancybox_auto);</script> </div> </div> <div class="soc-buttons"> <div class="yashare-auto-init" data-yashareL10n="ru" data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,gplus" data-yashareTheme="counter"></div> </div> <script>!window.jQuery && document.write('<script src="http://yastatic.net/jquery/2.1.3/jquery.min.js"><\/script>');</script> <script src="http://easy-code.com.ua/wp-content/themes/elegantblue/js/jquery.hc-sticky.min.js"></script> <script> jQuery(document).ready(function($){ $('.soc-buttons').hcSticky({ top: 25, bottomEnd: 90, wrapperClassName: 'sidebar-sticky2', noContainer: false }); }); </script> <script type="text/javascript" src="//yastatic.net/share/share.js" charset="utf-8"></script> </body> </html> <!-- Dynamic page generated in 0.566 seconds. --> <!-- Cached page generated by WP-Super-Cache on 2017-08-19 00:42:52 --> <!-- super cache -->