Sqlite 如何在设计时Firedac中设置主表字段?
我想让一个非空非自动inc整数成为我的主键,但我无法在使用Firedac的设计时这样做。Sqlite 如何在设计时Firedac中设置主表字段?,sqlite,delphi,firedac,delphi-10.2-tokyo,Sqlite,Delphi,Firedac,Delphi 10.2 Tokyo,我想让一个非空非自动inc整数成为我的主键,但我无法在使用Firedac的设计时这样做。TIntegerfield没有参数允许我将其设为主要参数。TFDTable中也没有参数,我可以从所有可用字段中选择主字段 我明白了在代码中实现它是可能的&将它与我的设计时间表结合起来,但这超出了在设计时完成所有工作的全部目的 早些时候,我的表中有一个auto inc ID,它被自动设置为主键。我现在删除了这个字段,因为我需要另一个整数作为主整数。 另外,我在Embacadero官方网站上找不到关于主键的信息&
TIntegerfield
没有参数允许我将其设为主要参数。TFDTable
中也没有参数,我可以从所有可用字段中选择主字段
我明白了在代码中实现它是可能的&将它与我的设计时间表结合起来,但这超出了在设计时完成所有工作的全部目的
早些时候,我的表中有一个auto inc ID,它被自动设置为主键。我现在删除了这个字段,因为我需要另一个整数作为主整数。
另外,我在Embacadero官方网站上找不到关于主键的信息&
TFDTable
。最好使用数据库中的一个新表和一个最小的新Delphi项目进行试验
更新:有关数据库DDL和表单的DFM,请参见下文
您需要将ID字段标记为数据库中的主键
将FDConnection和FDTable添加到项目后,从下拉列表中选择FDTable的TableName。然后,单击FDTable的IndexName字段,您应该会在表的主键上找到一个自动命名的索引。只需选择它,以便IndexName获取其值。就这些
对于使用下面的DDL创建的表,FDTable的IndexName属性显示为sqlite\u autoindex\u test\u 1
如果随后dbl单击FDTable并使用弹出字段编辑器在FDTable上设置持久字段,然后选择ID字段,您应该会发现,如果检查其ProviderFlags,它们应该包括pfInKey
,这告诉FireDAC在生成SQL时将字段用作表的主键来更新它,做插页等
顺便说一句,您应该发现ID字段的必填字段自动设置为True
如果要在添加新记录时自己提供ID字段的值,请使用表的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
谢谢你的回答。然而,我遵循了你的步骤,我没有看到ID获得主键。我只使用一个小的Delphi应用程序来创建数据库,并使用Database.net工具进行检查。只是为了证实;当您创建一个新的FDTable时,由于该表没有字段,IndexName中怎么会有内容?我不应该使用IndexFieldNames吗?该字段的“pfInKey”和“Required”处于活动状态。如何设置?FireDAC从数据库中读取表的元数据,因此它不需要已经定义持久字段来执行此操作。与其他db组件相比,FD似乎在获取此类元数据方面做得更好。顺便说一句,你说的“我没有看到ID得到主键”到底是什么意思?Delphi的TDataSet或其子体中没有这样的“PrimaryKey”。请参阅更新,它添加了DDL SQL来创建我正在使用的测试表。我重新检查了我的答案中的步骤,它们都很好地工作,正如所描述的那样。试试看。