使用外键REFERENCE约束删除行时用户友好的错误消息

Iva*_*vic 1 .net c# sql validation ado.net

处理具有FK REFERENCE约束的db行的最佳做法是什么?我的目标是向最终用户提供更加用户友好的错误消息.请注意,我不t want to delete department with employees and that I don希望在表上进行级联删除.

例如,如果我们有两个表:

-- Department table
CREATE TABLE [dbo].[Department](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
 CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

-- Employee table
CREATE TABLE [dbo].[Employee](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [DepartmentId] [int] NULL,
 CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[Employee]  WITH CHECK ADD  CONSTRAINT [FK_Employee_Department] FOREIGN KEY([DepartmentId])
REFERENCES [dbo].[Department] ([Id])
GO
ALTER TABLE [dbo].[Employee] CHECK CONSTRAINT [FK_Employee_Department]
Run Code Online (Sandbox Code Playgroud)

如果想要删除department表中的行,那么在employee表中引用该行.应该怎么做?

  1. 在执行DELETE语句之前,检查employee表中是否引用了行,并优雅地将错误返回给GUI(如果需要,使用eployee列表)

  2. 执行DELETE语句并捕获异常,如:

    catch (SqlException ex) 
    { 
        switch (ex.Number) 
           case 547: HandleErrorGracefully()
    } 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 还有其他方法吗?

如果有人有应用程序示例的代码/链接会很好...

gbn*_*gbn 5

选项3:同时执行1和2

在检查(通过)和删除失败之间,有可能有人插入另一个进程.

在这种情况下,您可以向用户说"抱歉,出现问题"(但记录下来),看看他们是否想再试一次.然后检查将拦截它.