如何在设计时 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
我想将一个非空非自动增量整数作为我的主键,但我无法在设计时使用 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