如何设计用过一次就废弃的号码 就像是手机充值

解决方案 »

  1.   

    如果有网卡就用guid,不用担心重复的问题
      

  2.   

    我们的应用还是自定义规则生成序列号的,guid生成的太“难看”
      

  3.   

    如果自定义格式,要求生成随机号码,系统确需要保证100%正确不出错时,只能生成一个号码,加上标志列,用过的做上标志。但效率上是很郁闷的,每次生成时都要确保此号码没有生成过,当号码多到一定程序,扫描表要花N长时间。
    》》
    呵呵,开始我也郁闷过一段时间,你有没有试过作为PK?PK重复异常的捕捉出奇的快
    public class UBISerials
    {
    public static void MakeSerials(int num,MyRandom rnd,string batchid)
    {
    //递归调用
    int ierr=InsertSerials(num,rnd,batchid);
    if(ierr>0)
    MakeSerials(ierr,rnd,batchid);
    else
    {
    SqlConnection conn=new SqlConnection(Convert.ToString(System.Configuration.ConfigurationSettings.AppSettings["conn"]));
    SqlCommand cmd=new SqlCommand("sp_SerialBatchState",conn);
    //CREATE PROCEDURE sp_batchstate
    //@batchid nvarchar(50)
    //as
    //update batch set batch_state=0 where batch_id=@batchid
    //GO
    cmd.CommandType=CommandType.StoredProcedure;
    SqlParameter parm1=new SqlParameter("@batchid",SqlDbType.VarChar,50);
    parm1.Value=batchid;
    cmd.Parameters.Add(parm1);
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    } } public static int ResetNumber(string batchid)
    {
    SqlConnection conn=new SqlConnection(Convert.ToString(System.Configuration.ConfigurationSettings.AppSettings["conn"]));
    SqlCommand cmd=new SqlCommand("sp_SerialsNumberReset",conn);
    cmd.CommandType=CommandType.StoredProcedure;
    SqlParameter parm1=new SqlParameter("@batchid",SqlDbType.VarChar,50);
    parm1.Value=batchid;
    cmd.Parameters.Add(parm1);
    SqlParameter parm2=new SqlParameter("@notdonum",SqlDbType.Int);
    parm2.Direction=ParameterDirection.Output;
    cmd.Parameters.Add(parm2);
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    return (int)cmd.Parameters[1].Value;
    } public static int InsertSerials(int num,MyRandom rnd,string batchid)
    {
    int ierr=0;
    SqlConnection conn=new SqlConnection(Convert.ToString(System.Configuration.ConfigurationSettings.AppSettings["conn"]));
    SqlCommand cmd=new SqlCommand("sp_SerialAdd",conn);
    //CREATE PROCEDURE sp_addkey
    //@key nvarchar(50),@batchid nvarchar(50)
    //as
    //insert into keys (keys_key,keys_batch_id)values(@key,@batchid)
    //GO
    cmd.CommandType=CommandType.StoredProcedure;
    SqlParameter parm1=new SqlParameter("@key",SqlDbType.VarChar,50);
    SqlParameter parm2=new SqlParameter("@batchid",SqlDbType.VarChar,50);
    parm2.Value=batchid;
    cmd.Parameters.Add(parm1);
    cmd.Parameters.Add(parm2);
    conn.Open();
    for(int i=0;i<num;i++)
    {
    try
    {
    parm1.Value=rnd.GetRandomNum();
    cmd.ExecuteNonQuery();
    }
    catch
    {
    ierr++;
    }
    }
    conn.Close();
    return ierr;
    }
    }
      

  4.   

    晕  杂这么复杂列?
    用GUID 用过就丢了那有这么多麻烦事情?
      

  5.   

    用随机数经过一些简单的算法生成序列号存到sql里,用过一个就标记一下,比如给这条数据的used标记true
      

  6.   

    天啊 当然是用guid了 @_@
      

  7.   

    最简单就是加一个字段就ok了啊,used,没使用就0,使用就1啊,这不就ok了