我一直绞尽脑汁,在网上搜索如何做到这一点,但没有运气。
问题,
我有一个datagrid
,允许用户根据需要添加或删除行,它通过数据库中 NOT 的PK列索引列进行索引,例如:在这种情况下,ID是PK列,
ID | Name | Index
Guid 1 | Name 1 | 1
Guid 2 | Name 2 | 2
Guid 3 | Name 3 | 3
Guid 4 | Name 4 | 4
Guid 5 | Name 5 | 5
因此,当使用删除行时会发生这种情况:在此示例中为第2行,
ID | Name | Index
Guid 1 | Name 1 | 1
Guid 3 | Name 3 | 3
Guid 4 | Name 4 | 4
Guid 5 | Name 5 | 5
那么当删除行时,如何重置索引以保持当前顺序?所以它看起来像这样,
ID | Name | Index
Guid 1 | Name 1 | 1
Guid 3 | Name 3 | 2
Guid 4 | Name 4 | 3
Guid 5 | Name 5 | 4
我看过Reset identity seed after deleting records in SQL Server ,但这是服务器端,我想通过C#做这个应用程序端,更不用说这似乎只适用于PK列?
我将如何做这样的事情?
答案 0 :(得分:2)
根据您的描述,您不需要表格中的“索引”列。但是,您应该在桌面上写一个视图并使用the row_number() function来实现您的目标,如下所示:
create table [Example]
(
[ID] uniqueidentifier not null primary key,
[Name] varchar(50) not null
)
go
create view [vExample]
as
select [e].[ID]
, [e].[Name]
, row_number() over (order by [Name] asc) as [Index]
from [Example] as [e]
go
insert into [Example] ( [ID] , [Name] )
values (newid(), 'Name 1')
, (newid(), 'Name 2')
, (newid(), 'Name 3')
, (newid(), 'Name 4')
, (newid(), 'Name 5')
select * from [vExample] as [e]
delete from [vExample] where [Index] = 2
select * from [vExample] as [e]
但我不建议删除基于该列的记录,而是使用实际的主键,以确保删除正确的行。我刚才用这个作为演示。在现实世界中,另一个连接可能已经删除了“第2行”,这意味着当您使用相同的where子句时将删除以下行,因为编号已随第一次删除而更改。