#ms-access #delphi #delphi-2007 #ms-access-2000
#ms-access #delphi #delphi-2007 #ms-access-2000
Вопрос:
У меня есть приложение Delphi 2007, которое взаимодействует с базой данных Access 2000. Я внес изменения в структуру базы данных (добавление полей), и мне нужно сделать их видимыми в приложении Delphi, но это оказывается сложным. Я создал минимальное приложение Delphi и базу данных Access, и там видна та же проблема.
Мои шаги были:
- создайте базу данных Access с полями 1 и Field2
- используйте Настройки / Панель управления / Административные инструменты / Источники данных (32-разрядный ODBC), чтобы создать псевдоним для базы данных MS.
- создайте приложение Delphi.
- добавьте a
TDBGrid
в форму - добавьте a
TDataSource
в форму - установите
Datasource
для свойства сетки значениеDataSource1
- добавьте a
TTable
в форму - установите
Dataset
свойствоTDataSource
дляTable1
- установите
DataBaseName
свойствоTable1
для имени псевдонима, созданного для базы данных. - задайте
TableName
для свойства имя таблицы в исходной базе данных Access. - установите
Active
для свойства таблицы значение TRUE. Все поля, первоначально определенные в базе данных, отображаются в таблице. Проблема в том, что я хочу добавить поля позже к этому. Я могу сделать так, чтобы они отображались в виде столбцов в сетке, перестроив все с нуля, но должен быть более простой способ!
Какая принятая наилучшая практика для принудительного внесения изменений в структуру базы данных в среду IDE Delphi и результирующее приложение?
** Ответ на комментарий Кена Уайта **
Спасибо, Кен. Я ценю причины Columns
свойства DBGrid
, когда вам могут не понадобиться все поля в вашей сетке — моя проблема в том, что когда я использую MS Access для добавления некоторых полей в таблицу, а затем повторно открываю свой проект Delphi:
- если я отключу
TTable
и повторно подключу его,FieldDefs
свойство покажет добавленные поля. Все хорошо. - Затем я перехожу к TDBGrid. В отображаемых столбцах не отображаются дополнительные поля, только исходные.
Columns
Коллекция пуста. - когда я проверяю
Columns
свойство и пытаюсь добавить все поля, я просто получаю исходные поля. Если я попытаюсь добавить столбец «одно поле», список выбора предоставляет мне только исходные поля для выбора.
Я не понимаю, почему TTable
они могут видеть новые поля, но TDatasource
(в котором в качестве Dataset
значения свойства указано значение TTable) не может.
Комментарии:
1. Способ минимизировать проблемы при изменении структуры базы данных — избегать использования постоянных полей TF в наборах данных в приложении Delphi, и, если тип набора данных Delphi поддерживает постоянные TFieldDefs, избегайте их использования. Эти два типа постоянных коллекций не могут делать ничего такого, чего нельзя было бы сделать в коде, и вы можете сделать код адаптируемым к изменениям в базовой структуре набора данных. Но нет способа принудительно внести изменения, как вы, кажется, предполагаете.
2. Причина, по которой это не может быть сделано автоматически, заключается в том, что IDE не имеет возможности узнать, хотите ли вы включить новые столбцы или нет. Например, часто создается постоянное поле для использования в TDBGrid для отображения пользователю, но не включает каждый столбец таблицы в эту сетку для отображения, или когда вы используете связанную базу данных из другого приложения, которая включает столбцы, которые вы никогда не будете использовать в своем приложении.
3. Привет, Кен, комментарии под вопросом.