Vb.net 从数据库中删除主键

Vb.net 从数据库中删除主键,vb.net,winforms,ms-access,Vb.net,Winforms,Ms Access,在我的数据库中有两个表,订单和项目。如果我插入两个ID为1和2的订单,然后删除第二个订单,那么我的下一个ID将是3。我明白这一点,我也知道我不应该干扰表中的主键。但是,如果真的没有办法缩小ID,那么当我删除ID 2时,什么会困扰我呢?下一次当我向数据库添加一些订单时,我希望它放在ID 2上。那么自动编号是属于还是 我可能做得不对,因为我在这个函数中获得了订单: Private Sub GetLastOrderID() Try sqL = "SELECT ID FROM

在我的数据库中有两个表,
订单
项目
。如果我插入两个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


询问一些指示。谢谢。

下一个id不一定是最后一个加上一个,因为您已经发现,MS Access自己管理自动编号列。此外,在多用户场景中,两个用户可能会选择相同的最后一个键,并增加它,最终导致键冲突,这也可能会出现问题。 要确定最后插入的键,请使用以下SQL语句:

SELECT @@IDENTITY

无论您执行什么操作(自动编号或其他操作),删除操作都会导致不值得编写代码的间隙关闭。

也许您希望将其重新构造为getNextOrderId():


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

您的ID是自动编号字段吗?当您将记录插入数据库时,它将为您分配ID和订单号(假设这是自动编号)。然后您应该查询数据库以了解订单号是什么。在代码中选择一个订单号并让数据库也这样做会产生冲突我能用一些连接表解决这个问题吗?既然我不应该删除主键…我应该在使用INSERT后选择@标识吗?当我打开数据库连接时,我只使用SELECT@@@IDENTITY进行了尝试,它返回0,表示我的表中已有多少项。是的。在插入之后。
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