0

在我的数据库中,我有两个表,Orders并且Items. 如果我插入两个 ID 为 1 和 2 的订单,然后删除第二个订单,那么我的下一个 ID 将是 3。我明白,我也知道我不应该干扰表中的主键。但是,如果真的没有办法缩小 ID,那么当我删除 ID 2 时,下次当我向我的数据库添加一些订单时,我希望它被放置在 ID 2 上。自动编号然后落在或?

我可能做错了,因为我在这个函数中得到了我的订单:

 Private Sub GetLastOrderID()
    Try
        sqL = "SELECT ID FROM Order ORDER BY ID Desc"
        ConnDB()
        cmd = New OleDbCommand(sqL, conn)
        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)

        'next id in database is current + 1
        If dr.Read = True Then
            txtOrderID.Text = dr("ID") + 1
        Else
            txtidnarocila.Text = 1
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        cmd.Dispose()
        conn.Close()
    End Try
End Sub

所以一般来说,当我删除某个 ID 上的订单时,我会遇到问题,然后程序不知道缺少 ID。当我删除 ID 2 时,我的代码在数据库中仍然只看到一个 ID,并且我再次将“下一个 id”作为 2。但在数据库中是 3。

请求一些指示。谢谢你。

4

2 回答 2

0

下一个 id 不一定是最后一个加一,因为正如您所发现的,MS Access 自己管理自动编号列。此外,您还可能在多用户场景中遇到问题,其中两个用户可以选择相同的最后一个键,增加它并最终得到冲突的键。要确定最后插入的键,请使用以下 SQL 语句:

SELECT @@IDENTITY

无论您做什么,自动编号或其他方式,删除总是会导致不值得编写代码来填补空白。

于 2013-10-09T13:50:13.073 回答
0

也许您想将其重组为 getNextOrderId() :

Private Sub GetLastOrderID()
   int currentId = 0
   Try
    sqL = "SELECT ID FROM Order ORDER BY ID"

    //Stripped out connection handling
    //execute SQL

    while (dr.Read = True) {
        txtOrderID.Text = dr("ID")
        if (txtOrderID.Text > currentId +1)
           txtOrderID.Text = currentId + 1
           break
        else
           currentId++
    }

    End Try
End Sub

当然,随着订单数量的增加,这可能需要很长时间。如果您必须填写所有订单号,您有点卡住了,否则最简单的方法可能是跳过空白,或将它们标记为已取消的订单。

于 2013-10-09T13:53:29.087 回答