数据库自增长ID填报

编辑
  • 文档创建者:文档助手1
  • 浏览次数:19079次
  • 编辑次数:24次
  • 最近更新:Kevin-s 于 2019-06-04
  • 1. 描述

    数据库自增长 ID 填报是指在 FineReport 模板中进行数据填报的时候,不需要设置 ID 数据列,在往数据库中插入数据的时候,数据库的主键 ID 会自动增长。

    在填报中,数据批量处理时,使用流水号来作为自增长型主键进行数据更新,可是当用户同时进行并发填报,即多人同时对一张报表进行填报,一个用户填报提交后,另外一个用户没有与服务器进行同步,默认会出现一个流水号,与数据库中刚提交的内容冲突。下面我们以 SQL  Server 数据库为例,讲述数据库自增长 ID 填报实现报表的自动编号功能。

    2. SQL Server数据库

    在 SQL Server 数据库中,提供了标识,可以通过设置标识、标识种子和标识增量来实现 SQL Server 主键的自增长。

    2.1 自动编号设置

    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]

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

    注:由于 ID 自增长不需要自己输入,因此只需要填报 KH 字段,B2 单元格需要设置为纵向扩展,第二行的两个控件分别是,文本控件和按钮控件,按钮控件是插入行控件。

    3)填报属性设置

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


    注:为数据表中的字段绑定报表单元格。

    2.3 自增长 ID 使用

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


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


    3. Oracle 数据库

    3.1 自增长的实现

    在 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 ; -- 触发器结束



    CREATE SEQUENCE seq_name -- 尽量使用统一前缀命名,方便管理    
         INCREMENT BY 1   -- 自增步长 这里设置为 1  
         START WITH 1     -- 计数起点 这里设置为 1  
         NOMAXVALUE       -- 不设置最大值 可选项 MAXVALUE|MINVALUE  
         NOCYCLE          -- 一直累加,不循环    
         CACHE 10;   -- 如果追求效率 可设置缓存 如果在 Oracle 宕机或者断电等非正常中断服务的情况 可能会造成序列不连继续的情况出现,如果不使用缓存,则这里写NOCACHE
    * ORACLE 12C 引进了 Identity Columns 新特性,从而实现了列自增长功能。

    举例如下所示:


    CREATETABLE"CHF"."T_XIFENFEI"
       (    "ID" NUMBER GENERATED ALWAYS ASIDENTITY MINVALUE 1 MAXVALUE
       9999999999999999999999999999 INCREMENT BY1 START WITH1 
       CACHE 20 NOORDER  NOCYCLE  NOTNULLENABLE,
            "NAME"VARCHAR2(100)
       ) SEGMENT CREATION DEFERRED
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
     NOCOMPRESS LOGGING
      TABLESPACE "INMEMORY"



    3.2 模板实现

    其模板实现与 SQL Server 数据库一致,这里不再赘述。

    4. 常见问题

    4.1 报错信息

    在 7.0.4 版本及之后的版本,使用数据库自增长 ID 进行数据填报时,可能会发生下图所示报错:


    当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'KHK' 中的标识列插入显式值。

    4.2 报错原因

    出现该报错原因是因为在 7.0.4 及之后版本中,FineReport 数据填报自增长 ID 的时候,主键不能插入空数据,即报表填报属性处绑定的自增长 ID 字段所对应的单元格在进行填报时,不能为空,但是自增长 ID 本意就是不需要输入 ID,所以导致报错。

    4.3 解决方案

    将以下的内容放入记事本中,并将文件另存为insertIgnoreColumn.properties,放入%FR_HOME%\WEB-INF\resources文件夹下面即可,文件内容为:

    KHK.ignoreColumns=id


    注:其中 KHK 是填报数据的数据表名称,需要对应修改,如果有多个数据表需要使用自增长 ID,那么直接换行再加入这句话内容即可。

    新增insertIgnoreColumn.properties 文件或者修改 insertIgnoreColumn.properties 文件里的内容后,需重启 Web 服务才生效。

    附件列表


    主题: 填报应用
    标签: 暂无标签 编辑/添加标签
    如果您认为本文档还有待完善,请编辑

    文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
    关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
    若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

    此页面有帮助吗?只是浏览 [ 去社区提问 ]