Введення в ADO.NET I

ADO + – пара надбудов, Іліє (Порівняння
ADO + і ADO)

Програмісти,
пропрацювали досить довго з ADO
цілком могли оцінити простоту і
зручність цієї технології. Проте, Microsoft
не обмежилася кількома новими
методами, а переробила всю об'єктну
модель нової технології.

Здебільшого при використанні ADO
зберігалося активним з'єднання з базою
даних (хоча підтримується і
одноразове підключення з подальшою
втратою активного з'єднання). Тільки
це забезпечувало повну
функціональність. (Для об'єкта Recordset,
наприклад). Припустимо, в такому випадку
вам необхідно отримати дані з якоїсь
(Можливо дуже навіть солідної) таблиці.
Весь той час, поки інформація
зчитується, обробляється і т.д.
підтримується встановлене
з'єднання. Тільки після викликів
методів Close () об'єктів Recordset і Connection (вважаємо
їх відкритими) з'єднання буде
розірвано. У ADO + ж акцент ставиться на
модель з з'єднанням, не підтримує
весь час. У ADO + ви створюєте обєкт Recordset
УотсоедіненнимФ (Disconnected model) за уолчанію.
Таким чином після отримання даних
з'єднання може бути негайно
розірвано, навіть якщо з даними
необхідно проводити ті чи інші
операції.

Опрежая ваші заперечення,
скажу, що хоча ми могли виконати всі
вище сказане і з класичним Recordset
Object з ADO, але новий об'єкт, Dataset, був
значно поліпшений і доповнений.

Recordset vs Dataset.

Хоча об'єкт Recorset зникає в ADO +, його
переемнік, Dataset object, виконує схожі
функції, а тому і інтерфейси їх схожі.

Але, незважаючи на зовнішню схожість,
різниця в способі зберігання даних дуже
істотна. На відміну від Recordset Object, Dataset
Object дозволяє зберігати в одному об'єкті
різні таблиці, їх зв'язки, стовпці, рядки
і ключі. Більш того, підтримується
програмне додавання будь-якого з
перерахованого вище в об'єкт Dataset.

Тобто, в принципі, Dataset
може представляти дані як
реляційна база даних. Перерахуємо
основні особливості об'єкта Dataset:

1. Dataset не взаємодіє
безпосередньо з джерелом даних. 2.
Dataset дозволяє зберігати зв'язки між
таблицями.
3. Можливо переміщення за таблицями за їх
зв'язкам.
4. Dataset не використовує COM Marshalling для
передачі даних між компонентами. Для
цих цілей тепер використовується XML.
5. Так як за основу взято XML стала
можливої передача даних між
довільними (не тільки COM) об'єктами.

Принаймні одне
перевагу Dataset слід прямо з цього
списку: використання COM маршалинга
накладає обмеження на типи даних
і викликає конверцію даних при
передачу Disconnected Recordsen. Dataset ж вільний
від цих обмежень. XML дозволяє
передавати більш широкий набір даних, а
використання HTTP дозволить пересилати
дані інших компонентів через
брандмауери використовуючи стандартниуе
порти.

Managed Providers (Managed – дуже
модне слово в. NET)

У ADO + передбачено 2
постачальника даних, звані Managed Providers:
1. SQL Server 7.0 and higher provider (ADO + SQL ServerManaged Provider)
2. An OLE DB provider – для доступу до всіх
іншим типам даних (ADO + Managed Provider)
Постачальник даних відповідає за збір
даних і знає, як взаємодіяти з
базою даних. У той же час Dataset про БД не
знає нічого і його не хвилює, звідки
прийшли дані і куди підуть. Постачальник
повністю відповідає за роботу з БД,
виконуючи вибірки, відновлення, вставки і
т.д.

Як зрозуміло з назви, при роботі з SQL SERVER
7.0 and higher рекомендується використовувати SQL
Server managed provider. Використовуючи спеціальний
протокол (Tabular Data Stream – TDS), постачальник
надає прямий доступ до БД,
забезпечуючи максимальну
поізводітельность. Безумовно, можливо
використання та іншого постачальника, але
він створений більш загальним, а тому не може
досягти такого ж рівня виконання.

Якщо ж ви будете
використовувати не SQL Server то вам доведеться
використовувати загальний постачальник, який
заснований на чистому ODBC. Незалежно від
того, який постачальник ви будете
використовувати, вам доведеться працювати з
трьома загальними об'єктами для
взаємодії з БД:
 
1. Connection Object 
2. Command Object
3. DatasetCommand

Connection Object

Наступні приклади коду
ілюструють ініціалізацію з'єднання
з БД:

using System.Data;
using System.Data.SQL;

public class SQLConnect {
   private String connString = "";
   private SQLConnection dataConn = null;
   
   public string openConnection(String dbConnectString) {
      connString = dbConnectString;
      try {
         dataConn = new SQLConnection(connString);
         dataConn.Open();
         return "SQL Server Data Connection Opened";
      }
      catch (Exception e) {
         return(e.ToString());
      }
      finally {
         if (dataConn != null) {
            dataConn.Close();
         }
      }
   }
} // End Class

ADO+ Provider:

using System.Data;
using System.Data.ADO

public class ADOConnect {
   private String connString = "";
   private ADOConnection dataConn = null;
   
   public string openConnection(String dbConnectString) {
      connString = dbConnectString;
      try {
         dataConn = new ADOConnection(connString);
         dataConn.Open();
         return "ADO+ Data Connection Opened";
      }
      catch (Exception e) {
         return(e.ToString());
      }
      finally {
         if (dataConn != null) {
            dataConn.Close();
         }
      }
   }
}

Command Object

Хоча установка
з'єднання з БД важлива, але нам необхідно
засіб для отримання даних. Тут нам
допоможе Command object, використовуваний в ADO + так
само, як і в ADO

Нижче показані приклади
використання Command Object для обох Managed
Providers.

using System.Data;
using System.Data.SQL;

public class SQLConnect {
   private SQLConnection dataConn = null;
   private SQLDataReader reader = null;
   
   public string openConnection(HttpResponse Response,String
dbConnectString, String cmdString) {
      try {
         dataConn = new SQLConnection(dbConnectString);
SQLCommand sqlCmd = new SQLCommand (cmdString, dataConn);
         dataConn.Open();
         sqlCmd.Execute(out reader);
Response.Write ("<table> <tr> <td> <b> ID </ b> </ td>");
Response.Write ("<td> <b> Name </ b> </ td> </ tr>");
         while (reader.Read()) {
            Response.Write("<tr>");
Response.Write ("<td>" + reader ["CategoryID"]. ToString ());
            Response.Write("</td>");
            Response.Write("<td>");
Response.Write (reader ["CategoryName"]. ToString ());
            Response.Write("</td>");
            Response.Write("</tr>");
         }
         Response.Write("</table>");
return "<p> SQL Server Data Connection Opened";
      }
      catch (Exception e) {
         return(e.ToString());
      }
      finally {
         if (reader != null) {
            reader.Close();
         }
         if (dataConn != null) {
            dataConn.Close();
         }
      }
   }
} // End Class

ADO+ Provider:

using System.Data;
using System.Data.ADO;

public class ADOConnect {
   private ADOConnection dataConn = null;
   private ADODataReader reader = null;
   public string openConnection(HttpResponse Response,String 
dbConnectString, String cmdString) {
      try {
         dataConn = new ADOConnection(dbConnectString);
ADOCommand adoCmd = new ADOCommand (cmdString, dataConn);
         dataConn.Open();
         adoCmd.Execute(out reader);
Response.Write ("<table> <tr> <td> <b> ID </ b> </ td>");
Response.Write ("<td> <b> Name </ b> </ td> </ tr>");
         while (reader.Read()) {
            Response.Write("<tr>");
            Response.Write("<td>");
Response.Write (reader ["CategoryID"]. ToString ());
            Response.Write("</td>");
            Response.Write("<td>");
Response.Write (reader ["CategoryName"]. ToString ());
            Response.Write("</td>");
            Response.Write("</tr>");
         }
         Response.Write("</table>");
return "<p> ADO Server Data Connection Opened";
      }
      catch (Exception e) {
         return(e.ToString());
      }
      finally {
         if (reader != null) {
            reader.Close();
         }
         if (dataConn != null) {
            dataConn.Close();
         }
      }
   }
} // End Class

Command Object має безліч
конструкторів, які приймають різні
параметри. У наших прикладах ми
передавали рядок з SQL скриптом і Connection
Object .

Пара слів про DataReader Object – у
відміну від Dataset він використовує forwardonly
доступ і зберігає тільки один рядок в
пам'яті в кожний момент часу. Так як
він читає порядково, то змушений
підтримувати з'єднання (дуже схоже
на звичайний Recordset).

При ініціалізації об'єкту
встановлюються різні властивості по
замовчуванням. Наприклад, поле CommandType
встановлюється в CommandType.Text. Однак
легко можна викликати і збережені
процедури.

using System.Data;
using System.Data.SQL;

public class SQLConnect {
   private SQLConnection dataConn = null;
   private SQLDataReader reader = null;
   
   public string openConnection(HttpResponse Response,String
dbConnectString, String cmdString) {
   try {
      dataConn = new SQLConnection(dbConnectString);
      SQLCommand sqlCmd = new SQLCommand(cmdString,dataConn);
      sqlCmd.CommandType = CommandType.StoredProcedure;

      SQLParameter param = sqlCmd.Parameters.Add(new
SQLParameter ("@ CustomerID", SQLDataType.Char, 5));

      param.Direction = ParameterDirection.Input;
sqlCmd.Parameters ["@ CustomerID"]. Value = "ALFKI";
      dataConn.Open();
      sqlCmd.Execute(out reader);
Response.Write ("<table> <tr> <td> <b> Product Name </ b> </ td>");
Response.Write ("<td> <b> Total </ b> </ td> </ tr>");
      while (reader.Read()) {
         Response.Write("<tr>");
Response.Write ("<td>" + reader ["ProductName"]. ToString ());
         Response.Write("</td>");
Response.Write ("<td>" + reader ["Total"]. ToString ());
         Response.Write("</td></tr>");
      }
      Response.Write("</table>");
return "<p> SQL Server Data Connection Opened";
   }
   catch (Exception e) {
      return(e.ToString());
   }
   finally {
      if (reader != null) {
         reader.Close();
      }
      if (dataConn != null) {
         dataConn.Close();
      }
   }
   }
} // End Class

ADO+ Provider:

using System.Data;
using System.Data.ADO;

public class ADOConnect {
   private ADOConnection dataConn = null;
   private ADODataReader reader = null;

   public string openConnection(HttpResponse Response,String
dbConnectString, String cmdString) {
   try {
      dataConn = new ADOConnection(dbConnectString);
      ADOCommand adoCmd = new ADOCommand(cmdString,dataConn);
      adoCmd.CommandType = CommandType.StoredProcedure;
      ADOParameter param = null;
param = adoCmd.Parameters.Add ("@ CustomerID", ADODBType.Char, 5);
      param.Direction = ParameterDirection.Input;
adoCmd.Parameters ["@ CustomerID"]. Value = "ALFKI";
      dataConn.Open();
      adoCmd.Execute(out reader);
Response.Write ("<table> <tr> <td> <b> Product Name </ b> </ td>");
Response.Write ("<td> <b> Total </ b> </ td> </ tr>");
      while (reader.Read()) {
         Response.Write("<tr>");
Response.Write ("<td>" + reader ["ProductName"]. ToString ());
         Response.Write("</td>");
Response.Write ("<td>" + reader ["Total"]. ToString () + "</ td>");
         Response.Write("</tr>");
      }
      Response.Write("</table>");
return "<p> ADO Server Data Connection Opened";
   }
   catch (Exception e) {
       return(e.ToString());
   }
   finally {
      if (reader != null) {
      reader.Close();
      }
      if (dataConn != null) {
      dataConn.Close();
      }
   }
   }
} //End Class

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*