我正在将学生 ID 作为随机数输入数据库
int num = r.Next(1000);
Session["number"] = "SN" + (" ") + num.ToString();
但是有没有机会得到重复的号码?我怎样才能避免这种情况?
编辑 :: 我有一个身份列,学生 ID 与 ID 是分开的,我将从 UI 将随机学生 ID 输入数据库。
在数据库中拥有一个仅是整数唯一 ID 的列是一项非常常见的任务。以至于我曾经使用过的每个数据库都有一个特定的列类型、函数等来处理它。它会根据您使用的任何特定数据库而有所不同,但您应该弄清楚它是什么并使用它。
当然,您很有可能会得到一个重复的号码。Next 只是给你一个 0 到 1000 之间的数字,但不能保证这个数字不会是 Next 过去返回的某个数字。
如果您尝试使用唯一值,请考虑使用 Guids 而不是整数,或者使用不断增加的整数值而不是任何随机数。这里是关于 Guid http://msdn.microsoft.com/en-us/library/system.guid.aspx的参考页面
您可以使用 Guid 而不是随机 int ,它们将始终是唯一的
没有办法保证一个 int 是唯一的,除非你检查已经存在的每一个,即使那样 - 就像评论说的那样,当你传递 1000 个 id 时,你保证重复
编辑:
我提到我认为 Guid 在这里是最好的,因为这个问题,首先索引表不会花费很长时间 - 由于 int 的大小,假设会有少于 1000 名学生,128 位是在少于 1000 行的表中很好。
Guid 是学习的好东西——尽管它们并不总是最有效的方法
在 c# 中创建一个唯一的 Guid 有一个好处,您可以继续使用并在问题中显示该 ID,而无需再次访问 Db 来确定分配给学生的唯一 ID
是的,你会得到重复的。如果您想要一个真正独特的项目,您将需要使用 Guid。如果您仍然想使用数字,那么您将需要跟踪您已经使用过的数字,类似于数据库中的标识列。
您可以尝试使用以下方法生成 id Guid
:
Session["number"] = "SN" + (" ") + Guid.NewGuid().ToString();
它将大大减少获得重复 ID 的机会。
如果您使用的是随机数,那么没有没有办法避免它。总会有发生碰撞的可能。
我认为您可能正在寻找的是一个身份列,或者您的数据库服务器的任何等价物。
在 LINQ to SQL 中,可以像这样设置行:
[Column ( IsPrimaryKey = true, IsDbGenerated = true )]
public int ID { get; set; }
我不知道它是否对你有帮助,但也许这是一个很好的提示......
是的,当然有机会。
快速解决方法:
先检查是否是重复号码,然后重试,直到不再是重复号码。