自动生成的参考号重复两次以上

问题描述 投票:0回答:1

我一直在尝试创建一个自动参考编号,可用于识别每个用户,但在某些方面,该编号存在重复。

从我的代码来看,参考号应该是唯一的,但有多个相同的参考号。如何创建一个不可重复的唯一参考号?

例如,如果数据库表中存在像 539873321 这样的参考号,则应该生成一个新的参考号。但每当我进入该页面时,都会创建一个新的参考号,并且在某些情况下它会重复相同的数字,我将拥有大约 3 个相同的参考号 539873321

请问我想创建一个自动生成的不能重复的参考号,请问我该怎么做?

*这是我的代码,自动生成数字而不重复相同的数字

protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            AutoGenerateNumber();
        }
    }

此代码会生成 9 位自动参考号

private string GetAutoNumber()
    {
        string numbers = "1234567890";
        string characters = numbers;
        int length = 9;
        string id = string.Empty;
        for (int i = 0; i < length; i++)
        {
            string character = string.Empty;
            do
            {
                int index = new Random().Next(0, characters.Length);
                character = characters.ToCharArray()[index].ToString();
            } while (id.IndexOf(character) != -1);
            id += character;
        }

        return id;
    }

此代码是在数据库表中搜索参考号是否存在,然后它应该生成另一个参考号

private void AutoGenerateNumber()
    {
        try
        {
            using (SqlConnection con = new SqlConnection())
            {
                con.ConnectionString = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
                SqlDataReader dr;
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.Parameters.Clear();
                    cmd.CommandText = "SELECT reference_no FROM IDTable WHERE reference_no=@reference_no"; // Here I tried to check the table to see if the Reference number numbers exist. And if it exists then it should automatically create a new one                         cmd.Parameters.AddWithValue("@Reference_no", ReferenceLabel.Text);
                    cmd.Connection = con;
                    con.Open();
                    dr = cmd.ExecuteReader();
                }
                if (dr.HasRows)
                {
                   
                }
                else
                {
                    List<string> result = new List<string>();
                    if (Session["Numbers"] != null)
                    {
                        result = (List<string>)Session["Numbers"];
                    }

                    string number = GetAutoNumber();
                    if (!result.Contains(number))
                    {
                        result.Add(number);
                        Session["Numbers"] = result;
                        ReferenceLabel.Text = number;                         }
                }
            }
        }
        catch (SqlException ex)
        {
            string msg = "Error:";
            msg += ex.Message;
            throw new Exception(msg);
        }
    }
c# asp.net .net web-applications
1个回答
0
投票

首先

GetAutoNumber
不能保证是唯一的,它会生成伪随机数并且它肯定可以重复(但我想你已经知道了)。

但是然后您检查数据库中是否存在该数字(尽管您的代码没有反映这一点,但我猜传递给查询的值将由

GetAutoNumber
生成。

因此,想象一下您的代码是否由多个线程并行执行(为简单起见,假设为 2)。

两个线程都从

GetAutoNumber
生成了相同的伪随机数。两者同时检查其是否存在,并通过(该数字尚不存在)。两个线程都进一步继续,最终保留数字,导致重复。

您需要应用一些锁定机制,例如

lock
SemaphoreSlim
或其他:)

最简单的方法是锁定整个部分“检查数据库中是否存在数字,如果不存在,则保存它”。

© www.soinside.com 2019 - 2024. All rights reserved.