从sql列中自动编号datagridview中的ID列,并在删除任何行c#后变为自动计数?
大家好,我想在SQLServer中创建一个表(例如:employe)。这个表有列(ID、FName、LName、age..等等)从sql列中自动编号datagridview中的ID列,并在删除任何行c#后变为自动计数?,c#,sql,sql-server,C#,Sql,Sql Server,大家好,我想在SQLServer中创建一个表(例如:employe)。这个表有列(ID、FName、LName、age..等等) 我需要ID列为每个新行自动添加自动编号。 我将标识规范设置为“是”,如下所示: 但如果在ID列中设置了此设置,我将面临另一个问题,如下图所示: 现在如何使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>