最新历史版本 :数据库自增长ID填报 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

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 列实现自增长,就可以在列属性中设置是标识,修改标识增量和标识种子,如下图:

222
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]

在模板设计主体页面第一行分别添加两个文本控件和一个 插入行 的按钮控件,并在第三行中将数据列拖曳至对应单元格中,如下图:
222

3)填报属性设置

点击模板>报表填报属性,增加一个内置 SQL,如下图:

222

注:如果只有新增数据的需求,那么不需要绑定自增id字段,否则提交可能会报错当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'KHK' 中的标识列插入显式值

2.3 效果预览

点击填报预览,在 Web 端进行数据填报,如下图:

222

在 KH 标题下面的控件中插入2条数据,点击提交按钮,将数据提交入库,刷新页面,可以看到下面蓝色区域部分多了 2 条数据,即刚刚填报数据的数据,并且 ID列也进行了自增长。

222

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' 中的标识列插入显式值。

222

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服务器才会生效。