从sql列中自动编号datagridview中的ID列,并在删除任何行c#后变为自动计数?

从sql列中自动编号datagridview中的ID列,并在删除任何行c#后变为自动计数?,c#,sql,sql-server,C#,Sql,Sql Server,大家好,我想在SQLServer中创建一个表(例如:employe)。这个表有列(ID、FName、LName、age..等等) 我需要ID列为每个新行自动添加自动编号。 我将标识规范设置为“是”,如下所示: 但如果在ID列中设置了此设置,我将面临另一个问题,如下图所示: 现在如何使ID列在删除任何行后自动计数 所以我想我应该做一个循环,在每个新记录的ID值中添加新的数字。 并且每删除一行对ID列进行计数,以重置ID列中的编号列表 我想我的想法现在已经很清楚了。因此,这方面的任何帮助

大家好,我想在SQLServer中创建一个表(例如:employe)。这个表有列(ID、FName、LName、age..等等)

  • 我需要ID列为每个新行自动添加自动编号。 我将标识规范设置为“是”,如下所示:
但如果在ID列中设置了此设置,我将面临另一个问题,如下图所示:

  • 现在如何使ID列在删除任何行后自动计数
所以我想我应该做一个循环,在每个新记录的ID值中添加新的数字。 并且每删除一行对ID列进行计数,以重置ID列中的编号列表


我想我的想法现在已经很清楚了。因此,这方面的任何帮助都可以让它发挥作用。我使用的是c#。

假设您有一个employee表定义:

CREATE TABLE [dbo].[Employee](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [varchar](50) NULL,
    [LastName] [varchar](50) NULL,
    [DateOfBirth] [datetime] NULL,
    [SequenceNumber] [int] NOT NULL,
    [DateTimeStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Employee] ADD  CONSTRAINT [DF_Employee_DateTimeStamp]  DEFAULT (getdate()) FOR [DateTimeStamp]
GO
ID
设置为主键并自动递增。
SequenceNumber
列是我们感兴趣的列。它将按照您的要求按顺序保留。
DateTimeStamp
在添加新记录时也设置为当前日期时间-只是为了保留日志

现在我们有了一个存储过程,它将添加一个新的员工记录:

 CREATE PROCEDURE spAddNewEmployee
                @FirstName AS VARCHAR(50),
                @LASTNAME AS VARCHAR(50),
                @DATEOFBIRTH AS DATETIME            
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

        -- Insert statements for procedure here

    DECLARE @LAST_SEQUENCE_NUMBER AS INT;

    SELECT @LAST_SEQUENCE_NUMBER   = MAX([SequenceNumber]) FROM dbo.Employee

    IF(@LAST_SEQUENCE_NUMBER IS NULL)
    BEGIN
        SET @LAST_SEQUENCE_NUMBER = 1;
    END
    ELSE
    BEGIN
        SET @LAST_SEQUENCE_NUMBER = @LAST_SEQUENCE_NUMBER + 1

    END


    INSERT INTO dbo.Employee
    (
           [FirstName]
          ,[LastName]
          ,[DateOfBirth]
          ,[SequenceNumber]      
    )
    VALUES
    (
        @FirstName,
        @LastName,
        @DateOfBirth,
        @LAST_SEQUENCE_NUMBER
    )
    END
    GO
它将检索最后一个
SequenceNumber
值,如果该值不为空(将在添加第一条记录时),它将向其中添加1。接下来,该记录将与自动字段DateTimeStamp一起添加

到目前为止还不错。现在让我们进入删除员工部分,下面是删除员工存储过程:

CREATE PROCEDURE [dbo].[spDeleteEmployee]
                @EmployeeId  AS INT 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

    DECLARE @DELETED_SEQUENCE_NUMBER AS INT, @LAST_SEQUENCE_NUMBER AS INT;

    SELECT @LAST_SEQUENCE_NUMBER   =  MAX([SequenceNumber]) FROM dbo.Employee
    SELECT @DELETED_SEQUENCE_NUMBER   = [SequenceNumber] FROM dbo.Employee WHERE ID = @EMPLOYEEID

    DELETE FROM dbo.Employee
    WHERE ID = @EMPLOYEEID

    WHILE(@DELETED_SEQUENCE_NUMBER   <= @LAST_SEQUENCE_NUMBER)
    BEGIN
        UPDATE dbo.Employee
        SET SequenceNumber = @DELETED_SEQUENCE_NUMBER
        WHERE SequenceNumber = @DELETED_SEQUENCE_NUMBER + 1

        SET @DELETED_SEQUENCE_NUMBER = @DELETED_SEQUENCE_NUMBER + 1
    END


END

GO

希望这能回答您的问题。

在我看来,如果您只想在Gridview中显示序列号,则无需担心底层的自动递增主键

您可以使用
显示该序列号

请参见下面的示例:

<asp:GridView ID="GridView1" runat="server"  AutoGenerateColumns="False" >
<Columns>
        <asp:TemplateField HeaderText="#">
            <ItemTemplate>
                <%# Container.DataItemIndex + 1 %>
            </ItemTemplate>
            <ItemStyle Font-Bold="false" />
        </asp:TemplateField>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName"></asp:BoundField>
        <asp:BoundField DataField="LastName" HeaderText="LastName"></asp:BoundField>
</Columns>
</asp:GridView>


如果ID列设置为自动递增和主键,则无需明确提供其值。只需添加其他列的值,它将自动递增。删除任何记录时,ID也将被删除,如果添加了新记录,它将在删除记录后具有下一条记录的ID。假设您删除ID 8并添加另一条记录,其ID将是9而不是8。此解决方案对我很有帮助。请尝试it@YawarMurtaza是的,我将其设置为自动递增,但我在ID 8和ID 9中遇到了这个问题,如果我删除ID 8,下一个应该是ID 8而不是ID 9。谢谢兄弟@Ramshafarrukhit不会是ID 8,因为它被删除了!SQL Server数据库就是这样运行的ine有效。这可能有助于我们发现它对于审计目的非常有用。它允许我们查看哪些记录是在什么日期和时间添加的,以便我们可以在需要时查看最近的一次。非常感谢你,我的朋友,但我很抱歉我不擅长SQL编程和c#我能理解你的代码,但我不知道如何使用SQL和ma对代码做一些修改。我想我会去找某人,让他看看你的代码,也许他会帮我在程序中设置代码。再次感谢你。
<asp:GridView ID="GridView1" runat="server"  AutoGenerateColumns="False" >
<Columns>
        <asp:TemplateField HeaderText="#">
            <ItemTemplate>
                <%# Container.DataItemIndex + 1 %>
            </ItemTemplate>
            <ItemStyle Font-Bold="false" />
        </asp:TemplateField>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName"></asp:BoundField>
        <asp:BoundField DataField="LastName" HeaderText="LastName"></asp:BoundField>
</Columns>
</asp:GridView>