C#. ADO .NET. Простори імен ADO .NET. Огляд. Інтерфейси ADO .NET

Простори імен ADO .NET. Огляд. Інтерфейси ADO .NET


Зміст


1. Простір імен System.Data. Загальні відомості

Простір імен System.Data є базовим простором, що поєднує в собі інші простори імен, які використовують технологію ADO .NET для доступу до баз даних. Неможливо створити додаток, який використовує ADO .NET без використання цього простору імен.

У цьому просторі імен оголошено загальні класи (типи), що використовуються усіма постачальниками ADO .NET незалежно від джерела даних, яке вони використовують. В перелік засобів System.Data входять:

  • типи (класи), що представляють різні примітиви баз даних до яких можна віднести таблиці, стовпці, рядки, обмеження тощо;
  • спільні інтерфейси, що реалізовані об’єктами постачальників даних;
  • виключення, що специфічними для баз даних (NoNullAllowedException, RowNotInTableException, MissingPrimaryKeyException).

У нижченаведеному переліку представлені основні типи (складові) простору імен System.Data:

  • клас Constraint – реалізує обмеження, що можуть накладатись на один або декілька об’єктів типу DataColumn;
  • клас DataColumn – представляє один стовпчик в таблиці бази даних;
  • клас DataRelation – представляє зв’язок між таблицями типу DataTable;
  • клас DataRow – один рядок (запис) в об’єкті типу DataTable;
  • клас DataSet – представляє кеш даних в пам’яті, який складається з довільної кількості взаємозв’язаних об’єктів DataTable;
  • клас DataTable – блок даних у вигляді таблиці;
  • клас DataTableReader – реалізує доступ до даних таблиці DataTable в режимі “тільки для читання” і в прямому напрямку (з початку до кінця);
  • клас DataView – забезпечує користувацьке представлення, яке прив’язане до даних (databindable customized view) для виконання операцій сортування, фільтрування, пошуку, редагування і навігації. Цей клас не зберігає дані а тільки містить зв’язок з даними об’єкту DataTable. Операції, що вносять зміни в DataView, будуть впливати на дані в DataTable. І, навпаки, зміни в даних об’єкту DataTable будуть впливати на всі представлення типу DataView, що відображають ці дані;
  • інтерфейс IDataAdapter – визначає основну поведінку об’єкту адаптеру даних (DataAdapter);
  • інтерфейс IDataParameter – визначає основну поведінку об’єкту параметру (DbParameter);
  • інтерфейс IDataReader – визначає поведінку об’єкту читання даних (DbDataReader);
  • інтерфейс IDbCommand – визначає поведінку об’єкту, що реалізує команди на мові SQL (DbCommand);
  • інтерфейс IDbConnection – визначає поведінку об’єкту, що здійснює підключення до сховища даних (DbConnection);
  • інтерфейс IDbDataAdapter – розширює IDataAdapter для отримання додаткових можливостей об’єкту адаптеру даних (DbDataAdapter);
  • інтерфейс IDbTransaction – визначає поведінку об’єктів, що реалізують транзакцію.

 

2. Інтерфейси ADO .NET
2.1. Інтерфейс IDbConnection. Об’єкт підключення

Інтерфейс IDbConnection містить набір елементів, які використовуються:

  • для налаштування підключення до конкретного постачальника даних (DbConnection, SqlConnection, OledbConnection, OdbcConnection);
  • для отримання об’єкту, що виконуватиме транзакцію. Такий об’єкт може бути одного з типів: DbTransaction, SqlTransaction, OledbTransaction, OdbcTransaction.

Приблизна реалізація інтерфейсу наступна:

public interface IDbConnection : IDisposable
{
  string ConnectionString { get; set; }
  int ConnectionTimeout { get; }
  string Database { get; }
  ConnectionState State { get; }
  IDbTransaction BeginTransaction();
  void ChangeDatabase(string databaseName);
  void Close();
  IDbCommand CreateCommand();
  void Open();
}

Складові елементи інтерфейсу мають наступне призначення:

  • ConnectionString – рядок під’єднання з базою даних;
  • ConnectionTimeot – час в секундах, протягом якого об’єкт типу DbConnection (або похідного типу) пробує встановити з’єднання з джерелом даних;
  • Database – ім’я бази даних;
  • State – описує поточний стан з’єднання з джерелом даних;
  • BeginTransaction() – починає виконувати транзакцію в базі даних;
  • ChangeDatabase() – змінює базу даних для відкритого з’єднання з поточним постачальником даних (SqlConnection, OledbConnection і т.д.);
  • Close() – закриває з’єднання з базою даних, яка була попередньо відкрита методом Open(). Поєднання цих методів реалізується в режимі підключення до бази даних (так званий під’єднаний рівень);
  • CreateCommand() – створює команду на мові SQL для поточного з’єднання;
  • Open() – відкриває з’єднання для доступу до бази даних в підключеному режимі (під’єднаний рівень).

 

2.2. Інтерфейс IDbTransaction. Робота з транзакціями

В інтерфейсі IDbTransaction визначені складові, які дозволяють програмним шляхом взаємодіяти з сеансом транзакцій та відповідним сховищем даних. Транзакція створюється з допомогою методу BeginTransaction(), який описаний в інтерфейсі IDbConnection.

Інтерфейс IDbTransaction має наступне оголошення:

public interface IDbTransaction : IDisposable
{
  IDbConnection Connection { get; }
  IsolationLevel IsolationLevel { get; }
  void Commit();
  void Rollback();
}

Елементи інтерфейсу мають наступне призначення:

  • інтерфейс Connection – посилання на поточне з’єднання зі сховищем даних;
  • зчислення IsolationLevel – визначає транзакцію, яка блокує поведінку для з’єднання;
  • Commit() – метод, що фіксує транзакцію у базі даних;
  • Rollback() – метод, що здійснює відкат транзакції.

 

2.3. Інтерфейс IDbCommand. Задавання SQL-команди

Інтерфейс IDbCommand реалізується класами, об’єкти яких дозволяють програмно працювати з операторами на мові SQL, збережуваними процедурами та параметризованими запитами. Також об’єкти цих класів мають підтримку доступу до типу читання даних провайдера з допомогою методу ExecuteReader().

Специфікація інтерфейсу IDbCommand наступна:

public interface IDbCommand : IDisposable
{
  string CommandText { get; set; }
  int CommandTimeout { get; set; }
  CommandType CommandType { get; set; }
  IDbConnection Connection { get; set; }
  IDataParameterCollection Parameters { get; }
  IDbTransaction Transaction { get; set; }
  UpdateRowSource UpdatedRowSource { get; set; }
  void Cancel();
  IDbDataParameter CreateParameter();
  int ExecuteNonQuery();
  IDataReader ExecuteReader();
  object ExecuteScalar();
  void Prepare();
}

Нижче подано призначення елементів інтерфейсу IDbCommand:

  • властивість CommandText – текст команди на мові Transact-SQL (T-SQL), ім’я таблиці або збережуваної процедури які потрібно виконати над джерелом даних;
  • властивість CommandTimeout – часовий інтервал очікування перед завершенням спроби виконати команду і згенерувати помилку;
  • зчислення CommandType – визначає як командний рядок CommandText буде інтерпретуватись (SQL-текст, збережувана процедура тощо);
  • властивість Connection – об’єкт типу DbConnection, що визначає підключення для якого даний об’єкт DbCommand виконується;
  • властивість Parameters – колекція параметрів (якщо є), що отримує команда на мові SQL;
  • властивість Transaction – об’єкт транзації, яку виконує поточний об’єкт типу DbCommand;
  • властивість UpdatedRowSource – визначає, як результат SQL-команди застосовується до об’єкту типу DataRow у випадку виконання команди UPDATE в об’єкті DbDataAdapter;
  • метод Cancel() – пробує відмінити виконання команди, сформованої в об’єкті типу DbCommand;
  • метод CreateParameter() – створює новий екземпляр типу DbParameter (SqlParameter, OledbParameter, OdbcParameter);
  • метод ExecuteNonQuery() – виконує команду на мові Transact-SQL для заданого з’єднання. Метод повертає кількість рядків, на які було здійснено вплив;
  • метод ExecuteReader() – відправляє текст, що описаний в DbCommand.CommandText, в об’єкт DbCommand.Connection і будує колекцію (набір) записів типу DbDataReader. При побудові колекції DbDataReader враховується значення зчислення CommandBehavior;
  • метод ExecuteScalar() – виконує запит і повертає першу колонку першого рядка в результуючому наборі запиту. При цьому додаткові колонки чи рядки ігноруються;
  • метод Prepare() – створює підготовлену версію команди на екземплярі SQL Server.

 

2.4. Інтерфейси IDbDataAdapter, IDataAdapter. Адаптер даних між набором даних і базою даних

Адаптери даних (data adapter) призначені для проведення операцій читання/запису між наборами типу DataSet і конкретним сховищем даних (базою даних). Адаптери даних описуються в інтерфейсах IDbDataAdapter та IDataAdapter.

Інтерфейс IDbDataAdapter описує команди зчитування, вставки, редагування та видалення даних з таблиці на основі операторів SQL. Оголошення інтерфейсу наступне

public interface IDbDataAdapter : IDataAdapter
{
  IDbCommand DeleteCommand { get; set; }
  IDbCommand InsertCommand { get; set; }
  IDbCommand SelectCommand { get; set; }
  IDbCommand UpdateCommand { get; set; }
}

У цьому інтерфейсі елементи мають наступне призначення:

  • властивість DeleteCommand – описує команду DELETE на мові SQL;
  • властивість InsertCommand – інкапсулює SQL-команду INSERT;
  • властивість SelectCommand – інкапсулює команду вибірки даних зі сховища (SELECT);
  • властивість UpdateCommand – описує SQL-команду UPDATE.

Поведінку IDbDataAdapter визначає інтерфейс IDataAdapter. Цей інтерфейс оголошує засоби, що реалізують основну функцію адаптеру даних: забезпечення обміну даними між об’єктами DataSet та сховищем даних (базою даних). Також цей інтерфейс дозволяє відобразити імена стовпців з бази даних на більш зрозумілі відображувані імена. Оголошення інтерфейсу наступне

public interface IDataAdapter
{
  MissingMappingAction MissingMappingAction { get; set; }
  MissingSchemaAction MissingSchemaAction { get; set; }
  ITableMappingCollection TableMappings { get; }
  int Fill(System.Data.DataSet dataSet);
  DataTable FillSchema(DataSet dataSet, SchemaType schemaType);
  IDataParameter[] GetFillParameters();
  int Update(DataSet dataSet);
}

Складові інтерфейсу IDataAdapter мають таке призначення:

  • властивість MissingMappingAction – використовується для імен таблиць чи імен стовпців. Властивість вказує, чи потрібно передавати для фільтрування чи виявляти помилки для невідображуваних вихідних таблиць чи стовпців разом з їх вихідними іменами;
  • властивість MissingSchemaAction – вказує на те, чи додаються (ігноруються) відсутні вихідні таблиці, стовпці та їх зв’язки в схему набору даних або викликають появу помилки;
  • властивість TableMappings – вказує, як вихідна таблиця є відображена на таблиці в наборі даних;
  • метод Fill() – на основі імені набору даних додає або оновлює рядки в наборі даних таким чином, щоб вони відповідали рядкам в наборі даних. При внесенні змін використовується ім’я цього набору даних. Також створюється об’єкт таблиці DataTable, який має ім’я Table;
  • метод FillSchema() – додає об’єкт таблиці DataTable з іменем Table в конкретний об’єкт DataSet з одночасним налаштуванням схеми у відповідності з заданим об’єктом схеми типу SchemaType;
  • метод GetFillParameters() – повертає набір користувацьких параметрів коли виконується SQL-запит SELECT;
  • метод Update() – для заданого набору даних типу DataSet викликає одну з операцій INSERT, UPDATE або DELETE для кожного вставленого, зміненого та видаленого рядка в таблиці з іменем Table об’єкту DataTable.

 

2.5. Інтерфейси IDataReader та IDataRecord. Читання рядків з таблиці бази даних

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

Оголошення інтерфейсу IDataReader наступне:

public interface IDataReader : IDisposable, IDataRecord
{
  int Depth { get; }
  bool IsClosed { get; }
  int RecordAffected { get; }
  void Close();
  DataTable GetSchemaTable();
  bool NextResult();
  bool Read();
}

Властивості та методи інтерфейсу IDataReader мають наступне призначення:

  • властивість Depth – повертає значення вказуючи глубину вкладення для поточного рядка;
  • властивість IsClosed – повертає значення що вказує чи об’єкт читання даних є закритий;
  • властивість RecordAffected – повертає кількість рядків, на які відбувся вплив методами вставки, видалення та зміни в результаті виконання SQL-запиту;
  • метод Close() – закриває об’єкт IDataReader;
  • метод GetSchemaTable() – повертає об’єкт типу DataTable що описує метадані стовпця об’єкту IDataReader;
  • метод NextResult() – здійснює перехід до наступного результату у випадку читання результату на основі пакетної SQL-команди;
  • метод Read() – здійснює перехід до наступного запису. Якщо запису вже немає, то метод повертає false.

Інтерфейс IDataRecord є базовим для інтерфейсу IDataReader. У цьому інтерфейсі реалізовано елементи, які дозволяють витягувати з потоку даних строго типізовані значення (int, float, short тощо). В інтерфейсі IDataRecord оголошується велика кількість методів типу GetXXX(). Скорочений фрагмент оголошення інтерфейсу наступний:

public interface IDataRecord
{
  int FieldCount;
  object this[string name] { get; }
  object this[int i] { get; }

  bool GetBoolean(int i);
  byte GetByte(int i);
  char GetChar(int i);
  DateTime GetDateTime(int i);
  Decimal GetDecimal(int i);
  float GetFloat(int i);
  short GetInt16(int i);
  int GetInt32(int i);
  long GetInt64(int i);

  ...

  // Інші елементи

  ...

}

Нижче пояснюється зміст деяких елементів інтерфейсу IDataRecord:

  • властивість FieldCount – повертає число колонок в поточному рядку;
  • GetBoolean() – повертає значення визначеної колонки як boolean;
  • GetByte() – повертає значення визначеної колонки як byte;
  • GetChar() – повертає значення визначеної колонки як char;
  • GetDateTime() – повертає значення визначеної колонки як DateTime;
  • GetDecimal() – повертає значення визначеної колонки як Decimal;
  • GetFloat() – повертає значення визначеної колонки як float;
  • GetInt16(), GetInt32(), GetInt64() – повертає значення визначеної колонки як short, int, long.

 

2.6. Інтерфейси IDbDataParameter та IDataParameter. Параметр в запиті

В інтерфейсі IDbCommand є властивість Parameters, яка повертає строго типізовану колекцію. Ця колекція реалізує інтерфейс IDataParameterCollection. Цей інтерфейс надає доступ до набору класів, сумісних з інтерфейсом IDbDataParameter (об’єкти параметрів). Інтерфейс IDbDataParameter розширює інтерфейс IDataParameter.

Оголошення інтерфейсу IDbDataParameter виглядає наступним чином

public interface IDbDataParameter : IDataParameter
{
  byte Precision { get; set; }
  byte Scale { get; set; }
  int Size { get; set; }
}

Елементи інтерфейсу IDbDataParameter мають наступне призначення:

  • Precision – визначає точність числових параметрів;
  • Scale – визначає масштаб числових параметрів;
  • Size – розмір параметру.

Інтерфейс IDataParameter має наступне оголошення

public interface IDataParameter
{
  DbType DbType { get; set; }
  ParameterDirection Direction { get; set; }
  bool IsNullable { get; }
  string ParameterName { get; set; }
  string SourceColumn { get; set; }
  DataRowVersion SourceVersion { get; set; }
  object Value { get; set; }
}

Складові інтерфейсу IDataParameter мають наступне призначення

  • зчислення DbType – визначає тип даних поля, властивості або об’єкту типу Parameter провайдера .NET;
  • властивість Direction – значення, яке визначає чи параметр є тільки вхідним (input-only), тільки вихідним (output-only), двонаправленим (bidirectional) чи параметром повернення зі збережуваної процедури;
  • властивість IsNullable – повертає значення, яке визначає чи параметр приймає значення NULL;
  • властивість ParameterName – ім’я об’єкту типу IDataParameter;
  • властивість SourceColumn – ім’я колонки, яка є джерелом яке відображено на об’єкті DataSet. Це джерело використовується для завантаження або повернення значення IDataParameter.Value;
  • властивість SourceVersion – читає або встановлює об’єкт типу DataRowVersion для того, щоб використати його під час завантаження об’єкту IDataParameter.Value;
  • властивість Value – призначена для читання або встановлення значення параметру.

 


Споріднені теми