Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

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

IDbConnection
, то ему можно передавать любой объект подключения ADO.NET:

public static void OpenConnection(IDbConnection cn)

{

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

connection.Open;

}

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

DbConnection
) в качестве параметров или возвращаемых значений. Однако использование интерфейсов вместо базовых классов является общепринятой практикой.

Поделиться с друзьями: