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表中引用该行.应该怎么做?
在执行DELETE语句之前,检查employee表中是否引用了行,并优雅地将错误返回给GUI(如果需要,使用eployee列表)
执行DELETE语句并捕获异常,如:
catch (SqlException ex)
{
switch (ex.Number)
case 547: HandleErrorGracefully()
}
Run Code Online (Sandbox Code Playgroud)还有其他方法吗?
如果有人有应用程序示例的代码/链接会很好...
选项3:同时执行1和2
在检查(通过)和删除失败之间,有可能有人插入另一个进程.
在这种情况下,您可以向用户说"抱歉,出现问题"(但记录下来),看看他们是否想再试一次.然后检查将拦截它.