Firebird + FireDAC 界面操作的自增字段

Firebird + FireDAC

如果是在客户端程序直接使用 FireDAC 的 FdQuery 去操作数据库,大概是这样的:

DBGrid -> DataSource -> FdQuery -> FdConnection -> FireBird 数据库;

FireBird 数据库里面的定义:


假设某个表 T1 有一个主键字段 F1,在 FireBird 里面定义为自增字段,其实在 FireBird 里面,就是定义了一个整数字段,创建了一个 FireBird 特有的【Generator】(生成器),还创建了一个 【Trigger】(触发器);

触发器的代码:


'''
BEGIN
  IF (NEW.F1 IS NULL) THEN
      NEW.F1 = GEN_ID(T1_F1_GEN, 1);
END
'''

从触发器的代码可以看出来,插入的数据(没有 T1 字段值),则在插入时,从生成器 T1_F1_GEN 获取一个新的 ID 值。FireBird 的生成器的用途就是每次调用它,就获得一个自增的唯一编号,绝对不会多个客户端同时提交数据时出现重复编号。

在 FireBird 里面的设置,对于 FdQuery,设置其:


1. 设计期从数据库自动创建字段;具体操作步骤,这里假设你熟悉 Delphi,不详细描述;
2. 选择 F1 这个自增字段;
3. 在属性面板里面,对这个 F1 字段的属性进行以下设置:
3.1. AutoGenerateValue 属性,下拉选择:ArAutoInc;这个设置保证了新插入的记录,FdQuery 会自动帮它填写 F1 的值为 -1,-2,等等;
4. 选择 FdQuery1,在对应的属性面板里面找到属性:UpdateOptions,下拉展开;
4.1. 找到 AutoIncFields 属性,下来,选择 F1(设计期已经创建了静态字段,这里就能看到所有的静态字段);-- 经过测试,这里做了设置,字段 F1 的属性设置(上述 3.1)可以不用设置;
4.2. 其它属性保持默认。其中 GeneratorName 属性如果下拉,可以看到前述在 FireBird 数据库里面创建的生成器 T1_F1_GEN 的名字。但这里不需要选择它。因为真正插入数据库的时候,数据库会调用触发器去使用它。

----------
测试:

1. FdQuery 的 CachedUpdates 属性为默认的 False 时,新插入的数据,F1 字段会自动填入 -1,往下滚动 DbGrid,此时 FdQuery 会自动 POST,也就是将数据提交给数据库,此时可以立即看到 -1 会变成数据库自动产生的新的编号值;

2. FdQuery 的 CachedUpdates 属性为默认的 True 时,新插入的数据,F1 字段会自动变成 -1,往下滚动插入新的数据,会出现 -2, -3 等等,此时 FdQuery 没有提交到数据库。执行 FdQuery1.ApplyUpdates(0) 的代码,FdQuery1 把数据都提交到数据库,此时 DbGrid1 里面看到的 F1 字段,仍然是 -1, -2, -3,然后当 DBGrid 里面对游标进行滚动,-1,-2,-3 立即变成数据库里面新插入的记录的编号了。

----------
结论:

使用 FireBird + FireDAC 做自增字段,不需要写代码,简单设置一下就可以实现客户端的操作。

你可能感兴趣的:(数据库)