2013-02-03 50 views
0

我在我的表中有用户ID字段,我需要在我的应用程序中获取该值,并且每当我想添加新记录时,都应该按值增加' 1'vb.net中的自动增量nvarchar值

所以这就是我试图从我的表中获得最后的ID

对于实施例我有一个值作为“A000”和我需要“1”递增该值,以便它应该后成为“A001”等on..and' A999'正如PinnyM所指出的,它应该变成'A1000'

我不想写任何存储过程或从数据库的任何其他方式。我想用我现有的代码更简单的方法。

Dim strConnection As String = "Data Source=.\SqlExpress;Initial Catalog=Subscription;Integrated Security=True" 
Dim con As New SqlConnection(strConnection) 
con.Open() 
Dim comm As New SqlCommand 
comm.CommandText = "SELECT MAX(UserID) FROM Customers" 
comm.Connection = con 
Dim MaxUserID As Object = comm.ExecuteScalar() 
txtID.text=MaxUserID 
+1

达到'A999'后的行为应该是什么?它总是字符'A'后跟一个数字?并记录,像这样构建主键是一个_bad_的想法 - 坚持递增整数... – PinnyM

+0

@ PinnyM-首先感谢有一个视图在我的问题,是的,它应该总是提到'A'作为第一个字母和下一个它应该将值增加'1'即...如你所说在'A999'之后它应该变成'A1000'。 – coder

+0

对不起yep编辑... – coder

回答

0

我得到了它设法做这样的工作在创建后获得的价值:

Public Function IncrementString(ByVal Sender As String) As String 
    Dim Index As Integer 
    For Item As Integer = Sender.Length - 1 To 0 Step -1 
     Select Case Sender.Substring(Item, 1) 
      Case "000" To "999" 
      Case Else 
       Index = Item 
       Exit For 
     End Select 
    Next 
    If Index = Sender.Length - 1 Then 
     Return Sender & "1" ' Optionally throw an exception ? 
    Else 
     Dim x As Integer = Index + 1 
     Dim value As Integer = Integer.Parse(Sender.Substring(x)) + 1 
     Return Sender.Substring(0, x) & value.ToString() 
    End If 
End Function 
-1

基于上述意见,我建议:

comm.CommandText = "SELECT 'A' + RIGHT('000', CAST((MAX(primary_key) + 1) as nvarchar(255)), 3) FROM Customers" 

这样做是:

  • 获取最后的关键,并添加1
  • 演员为nvarchar
  • 必要时填充0(最多3位)

我绝对会不是尝试使用基于字符的密钥来执行此操作,因为UserID似乎已经建好。另外请注意,这不是原子性的,并且不能保证另一个连接在你做之前不会插入一行。所以它确实返回了一个乐观的价值,但实际上可能并不正确。如果这不适合你,然后考虑让IDENTITY做其工作,为你而行,用SCOPE_IDENTITY()

+0

感谢Pinny帮助我,我会检查并将其标记为已接受:) – coder

+0

请问downvoter请解释他们的动机? – PinnyM