1. 概述
1.1 问题描述
数据库自增长 ID 填报是指在 FineReport 模板中进行数据填报的时候,不需要设置和绑定 ID 数据列。在往数据库中插入数据的时候,数据库会自动为每条数据生成一个递增的ID。
1.2 实现思路
自增长ID的实现主要依赖数据库的设置,需要先在数据表中创建对应的自增ID字段。具体创建方式每种数据库可能会有区别,可百度查找相关资料。
本文将简单介绍几种常见数据库的自增id设置方式。
注1:用户也可通过安装「序列号函数插件」,实现生成序列,主要用于填报生成主键功能。该插件无需依赖数据库的类型,方便报表切换数据库,在任意数据库都可以使用。详情请参见:序列号函数插件
注2:方案支持移动端填报。
2. SQL Server数据库
在 SQL Server 数据库中,提供了标识,可以通过设置标识、标识种子和标识增量来实现 SQL Server 主键的自增长。
2.1 自增长ID设置
1)假设在 SQL Server 数据库中存在下面一张数据表,我们需要将其 ID 列实现自增长,就可以在
中设置 ,修改标识增量和标识种子,如下图:
2)也可以使用 SQL 语句来创建,identity(1,1)指定 ID 由 1 开始,每次增长 1.
create table KHK (
id int identity(1,1) primary key,
kh varchar(20)
)
2.2 模板制作
1)新建数据连接
新建一个数据连接,连接至该数据库,新建数据连接的方法详细请参照 数据连接。
2)模板设置
新建一张模板,添加数据集SELECT * FROM dbo.[KHK]。
在模板设计主体页面第一行分别添加两个文本控件和一个 插入行 的按钮控件,并在第三行中将数据列拖曳至对应单元格中,如下图:
3)填报属性设置
点击「模板>报表填报属性」,增加一个内置 SQL,如下图:
注:如果只有新增数据的需求,那么不需要绑定自增id字段,否则提交可能会报错「当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'KHK' 中的标识列插入显式值」。
2.3 效果预览
点击「填报预览」,在 Web 端进行数据填报,如下图:
在 KH 标题下面的控件中插入2条数据,点击「提交」按钮,将数据提交入库,刷新页面,可以看到下面蓝色区域部分多了 2 条数据,即刚刚填报数据的数据,并且 ID列也进行了自增长。
3. Oracle 数据库
3.1 自增长ID设置
在 Oracle 数据库中,提供了序列的功能,可以通过 Oracle 的序列及触发器,实现主键的自增长。
1) 创建序列
CREATE SEQUENCE seq_name -- 尽量使用统一前缀命名,方便管理
INCREMENT BY 1 -- 自增步长 这里设置为 1
START WITH 1 -- 计数起点 这里设置为 1
NOMAXVALUE -- 不设置最大值 可选项 MAXVALUE|MINVALUE
NOCYCLE -- 一直累加,不循环
CACHE 10; -- 如果追求效率 可设置缓存 如果在 Oracle 宕机或者断电等非正常中断服务的情况 可能会造成序列不连继续的情况出现,如果不使用缓存,则这里写NOCACHE
2)创建触发器
CREATE OR REPLACE TRIGGER TRG_name --触发器名称
BEFORE INSERT ON "tbl_name" -- 在向 tbl_name 表插入数据之前触发
FOR EACH ROW-- 表示该触发器为一个行级触发器
BEGIN -- 触发器开始 -- 以下代码表示触发器的行为
SELECT seq_name.nextval INTO :new.ID FROM dual ; -- seq_name.nextval返回的是序列的下一个值, 将该值设为新值插入到 tbl_name 表中的主键列 tbl_id 中去.
END ; -- 触发器结束
3.2 模板实现
其模板实现与 SQL Server 数据库一致,这里不再赘述。
4. 常见问题
4.1 问题现象
使用数据库自增长 ID 进行数据填报时,可能会发生下图所示报错:当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'KHK' 中的标识列插入显式值。
4.2 问题原因
出现该报错原因是,自增长ID的机制是插入数据时,自动给这条数据一个编号,而不需要人为填入。这时候如果在填报属性中给这个自增长字段绑定了值,那么就会导致上述的冲突报错。例如下图所示,id为自增长字段,给id绑定了值就会出现报错。
4.3 解决方案
4.3.1 方案一(适用于只需要新增数据,无更新和删除需求的场景)
移除填报属性中的自增长id字段。
4.3.2 方案二(适用于需要同时实现新增,更新和删除需求的场景)
将以下的内容写入记事本文件中,并将文件另存为insertIgnoreColumn.properties,放入%FR_HOME%\WEB-INF\resources文件夹下。该文件作用为在新增数据时,忽略掉自增长id字段。文件内容为:
KHK.ignoreColumns=id
说明:
KHK:填报数据的数据表名称,需要按照实际场景修改
id:自增长id的字段列名称,需要按照实际场景修改
注:如果有多个数据表需要使用自增长 ID,那么直接在此配置文件中换行写入即可。新增或修改配置文件都需要重启web服务器才会生效。