Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
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. Вспомните, что хотя точные имена реализуемых типов будут отличаться между поставщиками данных,