删除记录时如何重置表的标识列?

Posted

技术标签:

【中文标题】删除记录时如何重置表的标识列?【英文标题】:How to reset Identity Column Of Table when a record is deleted? 【发布时间】:2019-04-07 07:49:15 【问题描述】:

我有一个 Datagridview,其中填充了来自 SQL Server 的一些数据。这完全没有问题。

每次我在表中插入或更新记录时,我都想对表中名为CarIDIDENTITY 列进行RESEED,但是IDS 的顺序似乎不好,因为有时会删除记录。

在我的代码中,我使用“SQLCOMMANDBUILDER”来执行插入、更新或删除 操作。

我尝试了下面的代码,但我抛出了一个异常错误,上面写着“找不到表 0”。

我应该在哪里修复?

//THESE ARE CODE TO RESEED AN IDENTITY COLUMN

Sub ResetIDColumn()
    Try
        Dim querystring As String = "declare @max int " &
                        "Select @max=max([CarID]) FROM [dbo].[Cars]" &
                        "if @max IS NULL SET @max = 0 " &
                        "DBCC CHECKIDENT ('[Cars]', RESEED,@max)"
        ds = New DataSet
        da = New SqlDataAdapter(querystring, con)
        cmdbuilder = New SqlCommandBuilder(da)
        da.Fill(ds)
        DgvCarList.DataSource = ds.Tables(0)

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

 //CODE TO PUPOLATE DATAGRIDVIEW
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) 
Handles MyBase.Load
    Try
        Dim querystring As String = "SELECT * FROM [dbo].[Cars]"
        ds = New DataSet
        da = New SqlDataAdapter(querystring, con)
        cmdbuilder = New SqlCommandBuilder(da)
        da.Fill(ds)
        DgvCarList.DataSource = ds.Tables(0)

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

//CODE TO INSERT OR UPDATE DATA

Private Sub btnUpdate_Click(sender As System.Object, e As System.EventArgs) Handles btnUpdate.Click
    ResetIDColumn()
    Try
        da.Update(ds.Tables(0))
        MessageBox.Show("Update was successful!", "Data")
        Loaddata()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

//CODE TO LOAD DATA 
Sub Loaddata()
    Dim querystring As String = "SELECT * FROM [dbo].[Cars]"
    ds = New DataSet
    da = New SqlDataAdapter(querystring, con)
    cmdbuilder = New SqlCommandBuilder(da)
    da.Fill(ds)
    DgvCarList.DataSource = ds.Tables(0)
    DgvCarList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
End Sub

【问题讨论】:

一句话:不要这样做!你只是长期麻烦。一旦使用了身份 - 它就消失了 - 不要尝试“回收”它 - 这不是它的工作方式,只会给你带来悲伤和麻烦。保持身份价值不变,然后继续解决实际问题...... @marc_s 这实际上是 3 个字(嗯,现在更多了......),但这仍然是有人可以给 OP 的最佳建议。 @ZoharPeled:好吧——这只是在挑剔:D @marc_s 当然,毕竟我们是程序员……如果我们不挑剔,谁会呢? @Mligo 标识列的意义在于它是自动生成的。你不应该弄乱它的价值观,也不应该关心它们是什么。如果列的值具有业务意义,则该列不应是标识列。 【参考方案1】:

我越努力越努力,最后我发现-;

    你需要创建一个新的数据集,Sqlcommandbuilder和新的dataadapter然后查询 表中的数据(使用 select 语句)同时执行命令 使用“单个查询字符串”重置 id。

    执行两个命令的目的是使所有结果都存储在 SINGLE 中 数据集

    我决定在从表中删除记录后调用此子。

代码:

// Button click to delete a record
 Try
        If ds.Tables(0).Rows.Count > 0 Then
            Dim rowposition As Integer = DgvCarList.CurrentRow.Index
            Dim rowdelete As DataRow = ds.Tables(0).Rows(rowposition)
            rowdelete.Delete()
            da.Update(ds)
            MessageBox.Show("Delete was success!", "Data")
            Loaddata()
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

  // After delete completed Go and reset an identity column 
    ResetIDColumn()


  // code to reset an identity column
 Sub ResetIDColumn()
    Try
        Dim querystring As String = "SELECT * FROM [dbo].[Cars] go " &
                                     "DECLARE @max INT " &
                        "Select @max=max([CarID]) FROM [dbo].[Cars]" &
                        "if @max IS NULL SET @max = 0 " &
                        "DBCC CHECKIDENT ('[Cars]', RESEED,@max)"
        ds = New DataSet
        da = New SqlDataAdapter(querystring, con)
        cmdbuilder = New SqlCommandBuilder(da)
        da.Fill(ds)
        DgvCarList.DataSource = ds.Tables(0)

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub


          ...................Thank you all..................................

【讨论】:

以上是关于删除记录时如何重置表的标识列?的主要内容,如果未能解决你的问题,请参考以下文章

IDENTITY 列重置编号

如何将 oracle 中的 IDENTITY 列重置为新值

如何在有外键关系的表中删除数据

当一列具有唯一值时如何删除重复记录

重置数据库中的自动编号(身份字段)

删除表中的所有记录 ID从1开始