0

テーブルにUserIDフィールドがあり、アプリでその値を取得する必要があります。新しいレコードを追加する場合は常に、値「1」でインクリメントする必要があります。

これが、テーブルから最後のIDを取得しようとしている方法です。

たとえば「A000」という値があり、その値を「1」ずつインクリメントして「A001」などにする必要があります。 「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
4

2 に答える 2

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
于 2013-02-03T04:12:13.140 に答える
-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()

于 2013-02-03T03:55:26.440 に答える