Адаптеры данных используются для помещения объектов
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
сопоставлять имена столбцов базы данных с более дружественными к пользователю отображаемыми именами:
, который представляет общие линии поведения, поддерживаемые отдельно взятым объектом чтения данных. После получения от поставщика данных 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
) в качестве параметров или возвращаемых значений. Однако использование интерфейсов вместо базовых классов является общепринятой практикой.