再开Struts发过程中遇到一个编号自动生成的问题,甚是头疼,编号规则如下:系统当前日期+教师编号+自动增长的编号(date+teancherid+id),在每个教师提交报告时将自动生成的编号一并提交到数据库,问题主要出在后面自动增长的编号(id)上,要求教师每提交一个报告,编号自动加一,本人实在不知道把这个自动增长的操作写在什么位置,写在ActionForm中肯定不行(每次都回被重置),后来尝试取出当前登录教师曾经提交的纪录条数然后加1,但是后来发现,如果删除纪录后再提交会出现编号重复的问题,实在想不出好的办法,请高手帮忙!

解决方案 »

  1.   

    用newxy技术如下:
    将id设为主关键字,newxy会获得自动增量,num为保存你要求的字段,package common;import net.newxy.dbm.*;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import org.apache.commons.beanutils.DynaBean;public class TestDao extends BaseDAO{
        public Connection getConnection(String dsJndi) throws Exception {
            Connection cn=null;
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                cn = DriverManager.getConnection(
                            "jdbc:mysql://localhost:3306/mysql?user=root&password=mysql&characterEncoding=gbk");
            } catch (ClassNotFoundException ex) {
            } catch (IllegalAccessException ex) {
            } catch (InstantiationException ex) {
            } catch (SQLException ex1) {
                throw new Exception(ex1.getMessage());
            }
            return cn;
        }
        public static void main(String[] params){
            TestDao testDao=new TestDao();
            DynaDto dto=new DynaDto();
            dto.set_table("test1");
            dto.set("name","张三");
            try {
               Object result= testDao.update(dto);
               if(result!=null){
                   String sysDate=....;
                   String id=((DynaBean)result).get("id").toString();
                   ((DynaDto)result).set("num",sysDate+teachId+id);
                   dao.update(result);
               }
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
    newxy技术网站:http://www.newxy.net
      

  2.   


    建一个序列表CREATE TABLE T_SequenceNumber (
    id VARCHAR2 ( 100 ),
    businessSn VARCHAR2 ( 80 )
    );
    method:public String getBusinessSn(String bId){
       //1.根据bId获得businessSn
       //2.String b2=businessSn+1;
       //3.将b2更新到数据库
       //4.return b2;
    }注意同步的问题
      

  3.   

    nc201(Bricklayer)这种方法尝试过,总觉得效率有点低,每次生成需要对数据库进行两次操作,希望大家给出更好的方法,谢谢了:)
      

  4.   

    你的表中难道没有教师的ID字段吗? queryByID不就得出该教师的所有报告了吗?
    表设计不敢恭维
      

  5.   

    有啊,但是感觉order by了以后,如果在提交,一样会有跳跃的问题啊,
      

  6.   

    拿着个字段在数据库(MSSQL)中存什么类型?20060804111101会不会溢出阿
      

  7.   

    有办法。试试这个:
    select max(substr(编号字段,起点,长度)) from 表
    where 老师字段=老师编号
      

  8.   

    hbwhwang(我是catmiw的马甲)你的方法在MMSQL中确定可以吗?
      

  9.   

    再说了max()对字符串起作用吗?
      

  10.   

    用你自己的方法就可行,只是有一点,删除的时候不要实际从数据库删除,而应该增加一个State列,删除的时候将此列的值设定为“DELETE”,这样就可以了。你要求新的编号跟删除掉的编号不重复,考虑到历史追溯,必须这样做。
      

  11.   

    realwxz85() 可能用的取子串的函数不一样,思路应该是一样的
      

  12.   

    realwxz85() :
    上面我给的办法是我使用过的办法,保证可以!我是在oracle上实现的,但我相信在MYSQL上一样好使!
    max()不光对number有效,对string同样有效!
    你现在的关键问题是去搞清楚怎么在MYSQL中取子串!没必要在这里浪费时间了。
      

  13.   

    是MSSQL,但愿你的方法能行,我回去试试,非常感谢你!!