• 自动生成不重复的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

  • 相关阅读:
    git
    fragment
    Builder模式
    代码混淆
    android studio快捷键
    小知识点
    angular组件使用
    英语摘要2019-6-4
    英语笔记2019-4-3
    搭建Eureka注册中心时遇到的问题
  • 原文地址:https://www.cnblogs.com/yan-xue-biao/p/3863479.html
Copyright © 2020-2023  润新知