Простори імен ADO .NET. Огляд. Інтерфейси ADO .NET
Пошук на інших ресурсах:
Зміст
- 1. Простір імен System.Data. Загальні відомості
- 2. Інтерфейси ADO .NET
- 2.1. Інтерфейс IDbConnection. Об’єкт підключення
- 2.2. Інтерфейс IDbTransaction. Робота з транзакціями
- 2.3. Інтерфейс IDbCommand. Задавання SQL-команди
- 2.4. Інтерфейси IDbDataAdapter, IDataAdapter. Адаптер даних між набором даних і базою даних
- 2.5. Інтерфейси IDataReader та IDataRecord. Читання рядків з таблиці бази даних
- 2.6. Інтерфейси IDbDataParameter та IDataParameter. Параметр в запиті
- Споріднені теми
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 – призначена для читання або встановлення значення параметру.
⇑
Споріднені теми
- Вступ в ADO .NET. Постачальники даних (провайдери). Простори імен ADO .NET
- Клас DbConnection. Приклади
⇑