Vb.net 在构造函数中自动生成唯一ID
使用VB.net创建名为staff的新类,该类具有三个属性: Name、LastName、ID-应适合用作数据库中的主键 提供一个类构造函数来填充Name和LastName。ID应该在构造函数中自动生成,不应该传入 我知道如何创建类、属性和构造函数,我只需要知道如何在构造函数中自动生成ID字段。有可能这样做吗 我通常要做的是将数据库中的id字段设置为identity字段和主键,这样它会自动插入下一个可用的id,或者在我的应用程序中,我从数据库中读取最后一个id并将其添加到其中。但是我需要知道如何在构造函数中自动生成ID字段。Guid 如果对ID类型没有任何约束,则可以使用GUID:Vb.net 在构造函数中自动生成唯一ID,vb.net,constructor,Vb.net,Constructor,使用VB.net创建名为staff的新类,该类具有三个属性: Name、LastName、ID-应适合用作数据库中的主键 提供一个类构造函数来填充Name和LastName。ID应该在构造函数中自动生成,不应该传入 我知道如何创建类、属性和构造函数,我只需要知道如何在构造函数中自动生成ID字段。有可能这样做吗 我通常要做的是将数据库中的id字段设置为identity字段和主键,这样它会自动插入下一个可用的id,或者在我的应用程序中,我从数据库中读取最后一个id并将其添加到其中。但是我需要知道如何
Dim id As Guid = Guid.NewGuid()
您甚至可以将其保留为字符串:
Dim id As String = Guid.NewGuid().ToString("N")
它应该被授予在不同的机器上是唯一的(以满足您的需求,即它必须适合用作数据库中的主键)。另见
时间戳
更糟糕的情况是,如果您没有这样严格的要求(网络中的唯一性),您可以使用时间戳。当然,在这种情况下,你必须考虑更多的问题:
- 法定时间:时间每年来回两次
- 区域:如果用户在伦敦输入数据,然后他搬到纽约怎么办
- 并发性:您必须假设没有其他人将记录添加到您的数据库中(如果它们使用不同的技术,则可能会发生冲突)。如果执行是并发的(程序的多个实例同时运行),您也不能应用此方法
- 计时器粒度:系统日期的粒度较粗:如果您在短时间内构造了许多对象,则可能会有重复的ID。解决方法
- 应用程序的多个实例不会并行运行
- 您使用的是一台计算机(不是网络)
- 每次应用程序启动时,数据库都是空的
Shared
计数器。如果系统计时器粒度不是问题(请参阅关于时间戳的段落),您可以将其用作ID。由于粒度的限制,即使同一应用程序的多个实例同时运行,它也应该可以工作
如果使用共享
字段,则必须处理同步问题。按照中的建议,您可以使用同步锁
。作为替代方案,您可以使用联锁.Increment
操作
散列码
如果计数器的所有条件都满足,并且此条件也满足:
- 您的应用程序是32位的
- 您的对象不是
,并且它不重写ValueType
方法GetHashCode()
GetHashCode()
获得),因为(从):
换句话说,ReferenceEquals方法返回true的两个对象具有相同的哈希代码
因为Object.ReferenceEquals()
只在比较同一实例时返回true
,所以每个实例都有一个唯一的哈希代码(因为在32位应用程序中,哈希代码是对象引用本身)。请注意,这是一个实施细节,可能会发生变化
随机数
我知道这可能会让人震惊,但一个好的64位随机数生成器的冲突概率非常低。我重复非常非常低的概率(有关更多数学细节,请参阅)。不要使用System.Random
进行此操作
根据您使用的种子,您可能也能够在网络场景中生成随机数(不要忘记-需要引用-一个本地网络协议的早期草案建议使用32位随机数作为地址,由于用户的不良反馈,它已被更改,但这并不意味着它无法工作).你想要一个永远不会重复的数字!那为什么不直接用这个呢
Dim dateAndTime As Date
dateAndTime = Now
TextBoxPID.Text = Format(dateAndTime, "yyyyMMddHHmmss").ToString
除非数据输入以毫秒为单位,否则此解决方案非常有效。如果遇到毫秒问题,只需在字符串末尾添加一个计数器
counter +=1
TextBoxPID.Text = Format(dateAndTime, "yyyyMMddHHmmss").ToString & counter.ToString
如果您在网络上工作,并且有几个人在做数据输入,那么将他们的员工id添加到字符串中。每个问题都有简单的解决方案,但在大多数情况下(如果不是所有情况的话),这将不会产生问题。根据SNTP服务器生成随机唯一的用户ID。
我的要求有点不同;然而,我需要生成一个随机且唯一的用户ID,即10个数字,花费大量时间无法找到合适的解决方案。
因此,我最终得到了以下函数:;它的唯一性和随机性结果
根据一台试验机上的一个应用瞬间,它是增量唯一结果;因为用户将在非预选时间戳上一次性生成十位数字。除了玩随机字母前缀;我希望此功能可以提供一个解决方案:
Imports System.Globalization
Imports System.Net
Public Class GetNetTime
Public Shared Function GetUTC()
' connect to google servers
' you could use some SNTP time servers but can't be sure port will be open
' or you could just ping your own webserver
Dim myNetRequest As WebRequest = HttpWebRequest.Create("http://www.example.com")
' read response header from connection
Dim response = myNetRequest.GetResponse()
' read date/time header
' assume its UTC format
Dim GlobalUTC As String = response.Headers("date").ToString
' convert string to datetime object
Dim parsedDateTime As DateTime = DateTime.Parse(GlobalUTC)
' get UNIX time stamp
Dim unixTime = (parsedDateTime - New DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds
Return unixTime
End Function
End Class
要测试输出,可以添加:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim utc As String = GetNetTime.GetUTC
' add random alpha prefix to UNIX time stamp
Dim sPrefix As String = ""
Dim rdm As New Random()
For i As Integer = 1 To 3 ' if you need more than 3 alpah random charachters adjust i length
sPrefix &= ChrW(rdm.Next(65, 90))
Next
MsgBox(sPrefix & utc) ' OR MsgBox("ID" & sPrefix & utc)
' code here to use result
End Sub
我发现这个解决方案比查询SQL表、读取最后一个记录id和执行增量更有用
注释:
- 请不要介意冗长的回答;当我试图注释代码和 详细解释场景李>
- 我认为这有利于发电 在多个工作站上运行的应用程序的用户ID
- 请不要将该函数用于。。。循环或排气运行。
GYK1501270543
VWT1501270606
WRH1501270634
SKI1501270648
QXL1501270716
这也是基于上面的@wpcoder答案,但这是一个基本的形式,这一个适合我
Public Function UIDGen(ByRef f As String) As String
Dim currentTime As DateTime = DateTime.UtcNow
Dim StringTime As String = currentTime.ToString
Dim parsedDateTime As DateTime = DateTime.Parse(StringTime)
Dim unixTime = (parsedDateTime - New DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds
Dim utcString As String = unixTime.ToString
Dim sPrefix As String = ""
Dim rdm As New Random()
For i As Integer = 1 To 3 ' 3 Letters enough ?
sPrefix &= ChrW(rdm.Next(65, 90))
Next
f = (sPrefix & utcString)
Return f
End Function
构造器中生成的ID是否只需要在内存中的所有对象中唯一,还是在已经存储到DB的所有对象中唯一?它需要在DB中唯一,正如问题所说,它应该适合于