自动生成不重复的ID,利用2分查找,生成中间缺少的ID值,保持id的连续性

 #region  生成不重复的Id

        /// <summary>

        /// 根据参数生成一个在表内指定字段的唯一字符串

        /// </summary>

        /// <param name="length">字符串长度</param>

        /// <param name="tableName">表名</param>

        /// <param name="keyFieldName">字段</param>

        /// <returns>返回长度为length的字符串</returns>

        private static OracleDataAdapter oraAdp = null;

        public string GenerateKey(int length, string tableName, string keyFieldName)

        {

            // return "";

            ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["gdfsys"];

            string connectionString = settings.ConnectionString;

            if (oraAdp == null)

            {

                oraAdp = new OracleDataAdapter("select 1 from dual", connectionString);

            }

            oraAdp.SelectCommand.CommandText = "select " + keyFieldName + " from " + tableName + " order by " + keyFieldName;

            DataTable dt = new DataTable();

            oraAdp.Fill(dt);

            // 使用二分法查找

            int lower = 1;

            // 没有数据则默认为1

            if (dt != null && dt.Rows.Count > 0)

            {

                // 如果最后一条的ID等于记录数,则说明中间没有删除的ID,

                if (Convert36To10(dt.Rows[dt.Rows.Count - 1][0].ToString()) == dt.Rows.Count)

                {

                    lower = dt.Rows.Count;

                }

                else

                {

                    int upper = dt.Rows.Count - 1;

                    while (lower <= upper)

                    {

                        int m = (lower + upper) / 2;

                        if (m > 0 && Convert36To10(dt.Rows[m - 1][0].ToString()) > m)

                        {

                            upper = m - 1;

                        }

                        else

                        {

                            lower = m + 1;

                        }

                    }

                    lower = upper;

                }

                lower++;

            }

            return GetKey(length, Convert10To36(lower));

        }

        public string Convert10To36(int num)

        {

            string value = "";

            if (num == 0)

            {

                value = "0";

            }

            else

            {

                while (num > 0)

                {

                    int n = num % 36;

                    value = GetCharValue(n) + value;

                    num = num - n;

                    if (num > 0)

                    {

                        num = num / 36;

                    }

                }

            }

            return value;

        }

        private string GetCharValue(int num)

        {

            return num.ToString();

        }

        public string GetKey(int length, string num)

        {

            while (num.Length < length)

            {

                num = "0" + num;

            }

            return num;

        }

        public int Convert36To10(string num)

        {

            int value = 0;

            for (int i = 0; i < num.Length; i++)

            {

                //value = value + GetIntValue(num[num.Length - 1 - i]) * ((int)Math.Pow(10, i));

                //value += GetIntValue(num[num.Length - 1 - i]);

                value += GetIntValue(num[num.Length - 1 - i]) * ((int)Math.Pow(10, i));

            }

            return value;

        }

        private int GetIntValue(char num)

        {

            int GetValue = 0;

            if (num <= '9')

            {

                GetValue = int.Parse(num.ToString());

            }

            return GetValue;

        }

        #endregion

原文地址:https://www.cnblogs.com/yan-xue-biao/p/3863479.html