Каждое поле набора данных представляет собой отдельный столбец, для работы с которым в С++ Builder служат объект Field типа TField и объекты производных от него типов, например, TIntegerField, TFloatField или TStringField. Для доступа к этим объектам и, соответственно, к полям записей у набора данных есть специальные методы и свойства, доступные при выполнении приложения.
Свойство Fieldcount типа int указывает количество полей набора данных. Это свойство доступно только для чтения. Количество полей набора данных может отличаться от физического числа полей таблицы БД, поскольку в набор данных не обязательно включаются все поля таблицы. Состав полей формируется при разработке приложения с помощью Редактора полей набора данных и Редактора столбцов сетки DBGrid. Кроме того, возможно динамическое изменение состава полей во время выполнения приложения. Для компонента Query состав полей набора данных зависит также от SQL-запроса.
Значение свойства property
TFields* Fields = {read=FFields};
представляет собой поле (столбец) набора данных. К отдельному полю можно обратиться, указав его номер index в массиве Fields; номера полей находятся в пределах от нуля до Fieldcount - 1. Номер объекта поля в массиве полей определяет свойство index типа int. В отличие от Редакторов полей и столбцов, применяемых на этапе разработки приложения, свойство index можно использовать для определения и изменения порядка полей набора данных во время выполнения приложения.
Для примера рассмотрим чтение полей текущей записи:
void __fastcall TForm1::Button5Click(TObject *Sender)
{
for(int i = 0; i < Table1->FieldCount; i++)
ListBox1->Items->Add(Table1->Fields->Fields[i]->AsString);
}
Здесь содержимое каждого поля текущей записи интерпретируется как строковое значение и добавляется к списку ListBox1.
Номер поля в наборе данных не является заранее фиксированным и известным числом и зависит от порядка полей в таблице БД. от текущего состав полей набора данных, а также от значений свойств некоторых визуальных компонентов, связанных с этим набором, например сетки DBGrid. Так, при изменении порядка расположения столбцов в компоненте DBGrid соответственно изменяется порядок следования полей набора данных. В связи с этим обращение к какому-либо полю по его номеру в массиве полей может вызвать обращение совсем к другому полю. Поэтому для доступа к полям чаще используются методы FindField и FieldByName.
Функция
TField* __fastcall FindField(const AnsiString FieldName);
возвращает для набора данных поле, имя которого указывает параметр FieldName. В отличие от номера в массиве полей, имя поля более статично и изменяется реже. Кроме того, имя поля несет большую смысловую нагрузку, чем номер. Если заданное параметром FieldName поле не найдено, то метод FindField возвращает значение NULL. На практике чаще используется метод FieldByName, который отличается от метода FindField тем, что если заданное поле не найдено, то генерируется исключение.
Имя поля, определяемое параметром FieldName, является именем физического поля таблицы БД, заданным при создании таблицы, а не именем (свойством Name) объекта Field, которое создано для этого поля.
Для набора данных Query имя FieldName физического поля можно переопределить в тексте SQL-запроса. Свойство Fields и методы FindField и FieldByName наиболее часто используются для доступа к значению поля текущей записи совместно с такими свойствами объекта Field, как AsString, Aslnteger, AsFloat или AsBooiean, которые позволяют обращаться к значению поля как к строковому, целочисленному, вещественному или логическому значению соответственно.
Так, в коде:
void __fastcall TForm1::Button5Click(T0bject *Sender)
{
Label1->Caption = Table1->FieldByName("Name")->AsString;
int x = Table1->FieldByName("Size")->AsInteger;
Edit4->Text=IntToStr(x);
}
строковое значение поля Name отображается в надписи Label1, а переменной x присваивается целочисленное значение поля size и оно помещается в Редактор Edit4. Если же поле size содержит значение, которое нельзя интерпретировать как целое число, то генерируется исключение.
В рассмотренных примерах выполнялось чтение содержимого полей текущей записи. Аналогичным образом можно присваивать произвольному полю текущей записи новое значение, при этом набор данных должен находиться в режиме редактирования или вставки.
Например, с помощью следующих инструкций:
void __fastcall TForm1::Button5Click(TObject *Sender)
{
// Перевод набора данных в режим редактирования
Table1->Edit(); // Изменение значений полей
Table1->FieldByName("Name")->AsString = Edit1->Text;
Table1->FieldByName("Size")->AsInteger = 5;
Table1->Post(); // Сохранение изменений
}
выполняется присвоение новых значений полям Name и size текущей записи после того, как набор данных Table1 переведен в режим редактирования. Произведенные изменения сохраняются, а набор данных переводится в режим просмотра.