Как установить первичное поле таблицы во время разработки Firedac? - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу сделать целое число, не равное NULL, моим основным ключом, но я не могу сделать это во время разработки с Firedac.Для TIntegerfield нет параметра, который позволил бы мне сделать его основным.Также нет параметра TFDTable, где я могу выбрать основное поле из всех доступных полей.

Я понимаю, что возможно сделать это в коде и объединить его с моей таблицей времени проектирования, но это превосходит всю цель сделать все это во время разработки.

Ранее у меня былAuto-Inc ID в моей таблице, и это было автоматически установлено на первичный ключ.Я удалил это поле сейчас, потому что мне нужно другое целое число, чтобы быть основным.Также я не могу найти информацию о первичном ключе & TFDTable на официальном сайте Embacadero.

1 Ответ

0 голосов
/ 15 февраля 2019

Лучше всего поэкспериментировать с этим, используя новую таблицу в вашей базе данных и минимальный новый проект Delphi.

Обновление: см. Ниже о базе данных DDL и DFM формы.

Вам необходимо пометить поле идентификатора как первичный ключ в вашей базе данных.

После того, как вы добавилиFDConnection и FDTable для вашего проекта, выберите TableName FDTable из выпадающего списка.Затем щелкните в поле IndexName таблицы FDTable, и вы найдете автоматически названный индекс в первичном ключе таблицы.Просто выберите его так, чтобы IndexName принял его значение.Вот и все, что нужно сделать.

Для таблицы, созданной с использованием приведенного ниже DDL, свойство IndexName таблицы FDTable выглядит как sqlite_autoindex_test_1

Если вы затем щелкнете по FDTable при нажатии dbl и используетевсплывающий редактор полей для настройки постоянных полей в FDTable, а затем выбора поля идентификатора, вы должны обнаружить, что если вы изучите его ProviderFlags, они должны включать pfInKey, что говорит FireDAC об использовании поля в качестве основного поля таблицыключ при генерации SQL для его обновления, вставки и т. д.

Вы должны обнаружить, что для поля обязательного поля идентификатора автоматически установлено значение True, кстати.

Если вы хотите указать идентификаторЗначение поля самостоятельно при добавлении новой записи, используйте таблицу OnNewRecord, чтобы сгенерировать значение идентификатора и присвоить его полю.

DDL для test База данных Sqlite

create table test(
id int not null primary key,
AName nchar(12)
)

ProjectЭкстракт DFM

object Form2: TForm2
  object DBGrid1: TDBGrid
    DataSource = DataSource1
  end
  object DBNavigator1: TDBNavigator
    DataSource = DataSource1
  end
  object FDConnection1: TFDConnection
    Params.Strings = (
      'Database=D:\aaad7\sqlite\MADB1.sqlite'
      'DriverID=SQLite')
    Connected = True
    LoginPrompt = False
  end
  object DataSource1: TDataSource
    DataSet = FDTable1
  end
  object FDTable1: TFDTable
    IndexName = 'sqlite_autoindex_test_1'
    Connection = FDConnection1
    UpdateOptions.UpdateTableName = 'test'
    TableName = 'test'
    object FDTable1id: TIntegerField
      FieldName = 'id'
      Origin = 'id'
      ProviderFlags = [pfInUpdate, pfInWhere, pfInKey]
      Required = True
    end
    object FDTable1AName: TWideStringField
      FieldName = 'AName'
      Origin = 'AName'
      FixedChar = True
      Size = 12
    end
  end
end
...