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 – предназначено для чтения или установки значения параметра.

 


Связанные темы