在电子商务网站中,如果数据量大的话,经常容易生成重复订单号。下面是我写的一个生成不重复订单号 的一个方法,根据当天时间和最大订单来生成的,主键需要是递增的。 class Program { /// <summary> /// 锁对象 /// </summary> private static object obj = new object(); /// <summary> /// 当日最大订单号 /// </summary> private static int maxOrder = 0; /// <summary> /// 当日时间 /// </summary> private static int TodayDay=DateTime.Now.Day; static void Main(string[] args) { while (true) { Thread thread = new Thread(CreateOrder); thread.Start(); //Thread.Sleep(1000); } //CreateOrder(); } /// <summary> /// 生成16位订单号 /// </summary> static void CreateOrder() { StringBuilder str = new StringBuilder(); str.Append("Or");//订单开头 str.Append(DateTime.Now.ToString("yyyyMMdd"));//订单中间时间 lock (obj) { if (maxOrder == 0 || TodayDay != DateTime.Now.Day) { string Time = DateTime.Now.ToString("yyyy-MM-dd");// + " 00:00:00"; string strSql = string.Format("select top 1 substring(OrderNo,11,6) from OrderTable where addtime between '{0}' and '{1}' order by id desc", Time + " 00:00:00", Time + " 23:59:59");//这句sql语句很重要 using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=temp;Integrated Security=True")) { SqlCommand cmd = new SqlCommand(strSql, conn); conn.Open(); object orders = cmd.ExecuteScalar(); if (orders == null) maxOrder = 1; else maxOrder = Convert.ToInt32(orders.ToString().TrimStart('0')) + 1; } } else maxOrder++; } str.Append(maxOrder.ToString().PadLeft(6,'0'));//6位不足的补0 AddOrders(str.ToString()); Console.WriteLine(str.ToString()); } /// <summary> /// 添加订单记录 /// </summary> /// <param name="orderno"></param> static void AddOrders(string orderno) { string sql = string.Format("insert into OrderTable values('{0}','{1}')", orderno, DateTime.Now.ToString()); SqlConnection conn; using (conn = new SqlConnection("Data Source=.;Initial Catalog=temp;Integrated Security=True")) { try { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); cmd.ExecuteNonQuery(); } catch (Exception ex) { Console.WriteLine(ex.Message); Thread.Sleep(1000); maxOrder++; } } } }