如何在设计时 Firedac 中设置 table 主字段?

How to set a table field primary in design-time Firedac?

我想将一个非空非自动增量整数作为我的主键,但我无法在设计时使用 Firedac 这样做。 TIntegerfield 没有允许我将其设为主要参数的参数。 TFDTable 也没有参数,我可以从所有可用字段中选择主字段。

我知道可以在代码中完成它并将其与我的设计时间结合起来 table 但这超出了在设计时间完成所有工作的全部目的。

早些时候我的 table 中确实有一个 auto-inc ID,并且它被自动设置为主键。我现在删除了这个字段,因为我需要另一个整数作为主要整数。 另外,我在 Embacadero 官方网站上找不到有关主键和 TFDTable 的信息。

最好使用数据库中的新 table 和最小的新 Delphi 项目对此进行试验。

更新:请参阅下面的数据库 DDL 和表单的 DFM。

您需要将 ID 字段标记为数据库中的主键。

将 FDConnection 和 FDTable 添加到项目后,select 从下拉列表中选择 FDTable 的 TableName。然后,单击 FDTable 的 IndexName 字段,您应该会在 table 的主键上找到一个自动命名的索引。只是 select 它以便 IndexName 取其值。仅此而已。

对于使用下面的 DDL 创建的 table,FDTable 的 IndexName 属性 显示为 sqlite_autoindex_test_1

如果您随后双击 FDTable 并使用弹出的字段编辑器在 FDTable 上设置持久字段,然后 select 您的 ID 字段,您应该会发现,如果检查其 ProviderFlags,它们应该包括 pfInKey,这就是告诉 FireDAC 在生成 SQL 时使用该字段作为 table 的主键以更新它、执行插入等操作的原因。

您应该会发现 ID 字段的 Required 字段自动设置为 True,顺便说一句。

如果您想在添加新记录时自己提供 ID 字段的值,请使用 table 的 OnNewRecord 生成 ID 值并将其分配给该字段。

test Sqlite 数据库的 DDL

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

项目 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