Книги онлайн и без регистрации » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 246 247 248 249 250 251 252 253 254 ... 407
Перейти на страницу:
class="code">  void Commit();

  void Rollback();

  void Dispose();

}

Роль интерфейса IDbCommand

Интерфейс IDbCommand будет реализован объектом команды поставщика данных. Подобно другим объектным моделям доступа к данным объекты команд позволяют программно манипулировать операторами SQL, хранимыми процедурами и параметризированными запросами. Объекты команд также обеспечивают доступ к типу чтения данных поставщика данных посредством перегруженного метода ExecuteReader():

public interface IDbCommand : IDisposable

{

  string CommandText { get; set; }

  int CommandTimeout { get; set; }

  CommandType CommandType { get; set; }

  IDbConnection Connection { get; set; }

  IDbTransaction Transaction { get; set; }

  IDataParameterCollection Parameters { get; }

  UpdateRowSource UpdatedRowSource { get; set; }

  void Prepare();

  void Cancel();

  IDbDataParameter CreateParameter();

  int ExecuteNonQuery();

  IDataReader ExecuteReader();

  IDataReader ExecuteReader(CommandBehavior behavior);

  object ExecuteScalar();

  void Dispose();

}

Роль интерфейсов IDbDataParameter и IDataParameter

Обратите внимание, что свойство Parameters интерфейса IDbCommand возвращает строго типизированную коллекцию, реализующую интерфейс IDataParameterCollection, который предоставляет доступ к набору классов, совместимых с IDbDataParameter (например, объектам параметров):

public interface IDbDataParameter : IDataParameter

{

// Плюс члены интерфейса IDataParameter.

  byte Precision { get; set; }

  byte Scale { get; set; }

  int Size { get; set; }

}

Интерфейс IDbDataParameter расширяет 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; }

}

Вы увидите, что функциональность интерфейсов IDbDataParameter и IDataParameter позволяет представлять параметры внутри команды SQL (включая хранимые процедуры) с помощью специфических объектов параметров ADO.NET вместо жестко закодированных строковых литералов.

Роль интерфейсов IDbDataAdapter и IDataAdapter

Адаптеры данных используются для помещения объектов DataSet в хранилище данных и извлечения их из него. Интерфейс IDbDataAdapter определяет следующий набор свойств, которые можно применять для поддержки операторов SQL, выполняющих связанные операции выборки, вставки, обновления и удаления:

public interface IDbDataAdapter : IDataAdapter

{

  // Плюс члены интерфейса IDataAdapter.

  IDbCommand SelectCommand { get; set; }

  IDbCommand InsertCommand { get; set; }

  IDbCommand UpdateCommand { get; set; }

  IDbCommand DeleteCommand { get; set; }

}

В дополнение к показанным четырем свойствам адаптер данных ADO.NET также получает линии поведения, определенные базовым интерфейсом, т.е. IDataAdapter. Интерфейс IDataAdapter определяет ключевую функцию типа адаптера данных: способность передавать объекты DataSet между вызывающим кодом и внутренним хранилищем данных, используя методы Fill() и Update(). Кроме того, интерфейс IDataAdapter позволяет с помощью свойства TableMappings сопоставлять имена столбцов базы данных с более дружественными к пользователю отображаемыми именами:

public interface IDataAdapter

{

  MissingMappingAction MissingMappingAction { get; set; }

  MissingSchemaAction MissingSchemaAction { get; set; }

  ITableMappingCollection TableMappings { get; }

  DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType);

  int Fill(DataSet dataSet);

  IDataParameter[] GetFillParameters();

  int Update(DataSet dataSet);

}

Роль интерфейсов IDataReader и IDataRecord

Следующим основным интерфейсом является IDataReader, который представляет общие линии поведения, поддерживаемые отдельно взятым объектом чтения данных. После получения от поставщика данных ADO.NET объекта совместимого с IDataReader типа можно выполнять проход по результирующему набору в прямом направлении с поддержкой только чтения.

public interface IDataReader : IDisposable, IDataRecord

{

  // Плюс члены интерфейса IDataRecord

  int Depth { get; }

  bool IsClosed { get; }

  int RecordsAffected { get; }

  void Close();

  DataTable GetSchemaTable();

  bool NextResult();

  bool Read();

  Dispose();

}

Наконец, интерфейс IDataReader расширяет IDataRecord. В интерфейсе IDataRecord определено много членов, которые позволяют извлекать из потока строго типизированное значение, а не приводить к нужному типу экземпляр System.Object, полученный из перегруженного метода индексатора объекта чтения данных. Вот определение интерфейса IDataRecord:

public interface IDataRecord

{

  int FieldCount { get; }

  object this[ int i ] { get; }

  object this[ string name ] { get; }

  bool GetBoolean(int i);

  byte GetByte(int i);

  long GetBytes(int i, long fieldOffset, byte[] buffer,

    int bufferoffset, int length);

  char GetChar(int i);

  long GetChars(int i, long fieldoffset, char[] buffer,

    int bufferoffset, int length);

  IDataReader GetData(int i);

  string GetDataTypeName(int i);

  DateTime GetDateTime(int i);

  Decimal GetDecimal(int i);

  double GetDouble(int i);

  Type GetFieldType(int i);

  float GetFloat(int i);

  Guid GetGuid(int i);

  short GetInt16(int i);

  int GetInt32(int i);

  long GetInt64(int i);

  string GetName(int i);

  int GetOrdinal(string name);

  string GetString(int i);

  object GetValue(int i);

  int GetValues(object[] values);

  bool IsDBNull(int i);

}

На заметку! Метод IDataReader.IsDBNull() можно применять для программного выяснения, установлено ли указанное поле в null, прежде чем пытаться получить значение из объекта чтения данных (во избежание генерации исключения во время выполнения). Также вспомните, что язык C# поддерживает типы данных, допускающие null (см. главу 4), идеально подходящие для взаимодействия со столбцами, которые могут иметь значение null в таблице базы данных.

Абстрагирование поставщиков данных с использованием интерфейсов

К настоящему моменту вы должны лучше понимать общую функциональность, присущую всем поставщикам данных .NET Core. Вспомните, что хотя точные имена реализуемых типов будут отличаться между поставщиками данных,

1 ... 246 247 248 249 250 251 252 253 254 ... 407
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?