数据库中编号字段设置为主键。在访问页面时(或保存页面信息时),从数据中取值,即取id最大值。
Public Function GetMaxID(ByVal strTable As String) As Integer
        Dim iValue As Integer
        cm = New SqlClient.SqlCommand("SELECT IDENT_CURRENT('" & strTable & "')", cn)
        cn.Open()
        dr = cm.ExecuteReader()
        dr.Read()
        Try
            iValue = dr.GetValue(0)
        Catch
            iValue = 0
        End Try
        cn.Close()
        Return iValue
    End Function

解决方案 »

  1.   

    楼上的这种方式太慢,你可以这样:建立一个table,比如说叫BillNumberInfo,里面记录各种类型单据的当前最大编号。你对单据保存的时候,从这个表中取出采购入库单(假设)的当前最大编号,然后加一,作为你的这个单据的新编号,如果transcation成功,那么就回写BillNumberInfo这个表的这条记录的value=新单据最大编号。注意的一点就是,先对这个表的这条记录lock一下。当然,这种方法会有中间空号的情况出现,不过一般无所谓的。
      

  2.   

    同意 powerpeople(小鬼) 
    提示:amylqt(小妹)他说的是在保存的时候
      

  3.   

    把取编号封装一个静态函数中。
    在这个函数中LOCK来锁住得到编号的代码就可以了。
      

  4.   

    public static double GetKey(string strTable)
    {
    lock(typeof(SqlAccess))//SqlAccess是本静态函数所在的类。
    {
    double doubIdkey=-1;
    string strSQL;
    strSQL="select idkey from "+SqlAccess.strGetKeyTable
    +" where tablename='"+strTable+"'";
    object objIdkey=SqlAccess.ExecuteScalar(strSQL);
    if(objIdkey==null)
    {
      strSQL="insert into "+SqlAccess.strGetKeyTable
      +"(tablename,idkey) values('"+strTable+"',1)";
      if(SqlAccess.ExecSQL(strSQL))
      {
       doubIdkey=1;
      }
    }
    else
    {
    doubIdkey=double.Parse(objIdkey.ToString())+1;
    strSQL="update "+SqlAccess.strGetKeyTable
    +" set idkey=idkey+1 where tablename='"+strTable+"'";
    if(!SqlAccess.ExecSQL(strSQL))
    {
    doubIdkey=-1;
    }
    }

    return doubIdkey;
    }
      

  5.   

    同意 powerpeople(小鬼),在保存的时候,再生成单据号。
      

  6.   

    同意是zhyx21century的方法。
    表中单据编号采用自增字段。如果不满意自增字段的INT型,想产生自己的格式,当然也可以用自己的方法来生成唯一编号。但henryfan1的方法不可取,生成一个编号居然前端应用程序进行,即使正确,效率将及其低下(多次交互,并且LOCK)。如果要自己生成也要用触发器加储存过程的方法进行。