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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 377 378 379 380 381 382 383 384 385 ... 642

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);

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

  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. Вспомните, что хотя точные имена реализуемых типов будут отличаться между поставщиками данных, в коде такие типы применяются в схожей манере — в том и заключается преимущество полиморфизма на основе интерфейсов. Скажем, если определить метод, который принимает параметр IDbConnection, то ему можно передавать любой объект подключения ADO.NET:

public static void OpenConnection(IDbConnection cn)

{

<b>  // Открыть входное подключение для вызывающего кода.</b>

  connection.Open();

}

На заметку! Использовать интерфейсы вовсе не обязательно; аналогичного уровня абстракции можно достичь путем применения абстрактных базовых классов (таких как DbConnection) в качестве параметров или возвращаемых значений. Однако использование интерфейсов вместо базовых классов является общепринятой практикой.

То же самое справедливо для возвращаемых значений. Создайте новый проект консольного приложения .NET Core по имени MyConnectionFactory. Добавьте в проект перечисленные ниже пакеты NuGet (пакет OleDb действителен только в Windows):

Microsoft.Data.SqlClient

System.Data.Common

System.Data.Odbc

System.Data.OleDb

Далее добавьте в проект новый файл по имени DataProviderEnum.cs со следующим кодом:

1 ... 377 378 379 380 381 382 383 384 385 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий