我一直在尝试创建一个自动参考编号,可用于识别每个用户,但在某些方面,该编号存在重复。
从我的代码来看,参考号应该是唯一的,但有多个相同的参考号。如何创建一个不可重复的唯一参考号?
例如,如果数据库表中存在像 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);
}
}
首先
GetAutoNumber
不能保证是唯一的,它会生成伪随机数并且它肯定可以重复(但我想你已经知道了)。
但是然后您检查数据库中是否存在该数字(尽管您的代码没有反映这一点,但我猜传递给查询的值将由
GetAutoNumber
生成。
因此,想象一下您的代码是否由多个线程并行执行(为简单起见,假设为 2)。
两个线程都从
GetAutoNumber
生成了相同的伪随机数。两者同时检查其是否存在,并通过(该数字尚不存在)。两个线程都进一步继续,最终保留数字,导致重复。
您需要应用一些锁定机制,例如
lock
、SemaphoreSlim
或其他:)
最简单的方法是锁定整个部分“检查数据库中是否存在数字,如果不存在,则保存它”。