C# 插入记录并引发异常
如果C# 插入记录并引发异常,c#,sql,duplicates,C#,Sql,Duplicates,如果CardDescription在表中的行中,且带有特定的@idCar cardescription不是PK,不允许对设计进行任何更改 insert into carsdescription (description) value (@description,@idCar) 示例: IDCar | Description --------------------- 1 | nice - this record was in table before. 1
CardDescription
在表中的行中,且带有特定的@idCar
cardescription
不是PK,不允许对设计进行任何更改
insert into carsdescription
(description)
value
(@description,@idCar)
示例:
IDCar | Description
---------------------
1 | nice - this record was in table before.
1 | nice - should throw exception
2 | nice - it is allowed
Carsdescription表:
- ID(主键、整数、自动递增)
- idcar(FK,int)
- 说明(varchar)
- Id(整数、主键、自动递增)
- 姓名(nvarchar(255)
insert into carsdescription
(description)
SELECT (@description) FROM carsdescription
where idCar=@idCar;
INSERT没有WHERE,请在查询中使用SELECT语句来使用WHERE
insert into carsdescription
(description)
SELECT (@description) FROM carsdescription
where idCar=@idCar;
您应该在IDCar和Description上创建一个唯一的索引。然后,您的数据库将阻止插入重复数据。然后,您的CommandObject将引发异常
insert into carsdescription(IDCar, description)
values (@idCar, @description)
但为了善待用户,如果要插入重复条目,您应该首先在表中查找
select count(*) from carsdescription where IDCar = @idCar and decription = @description
编辑:
因此,有一些不允许更改架构的原因。这意味着,您的数据库无法保护您避免重复条目。因此,正如Matthew正确指出的,您必须:
- 首先:执行select语句。如果计数大于0,则引发异常
- 第二:做插入
insert into carsdescription(IDCar, description)
values (@idCar, @description)
但为了善待用户,如果要插入重复条目,您应该首先在表中查找
select count(*) from carsdescription where IDCar = @idCar and decription = @description
编辑:
因此,有一些不允许更改架构的原因。这意味着,您的数据库无法保护您避免重复条目。因此,正如Matthew正确指出的,您必须:
- 首先:执行select语句。如果计数大于0,则引发异常
- 第二:做插入
IF NOT EXISTS(SELECT * FROM dbo.cardescription
WHERE idCar = @idCar AND Description = @description)
INSERT INTO dbo.carsdescription(description, idCar)
VALUES(@description, @idCar)
ELSE
RAISERROR(N'Duplicate record - INSERT aborted', 16, 1)
在中读取RAISERROR-这将导致调用.NET应用程序中出现异常
但是使用唯一索引的解决方案肯定会更好
CREATE UNIQUE NONCLUSTERED INDEX UIX01_Cardescription
ON dbo.CarDescription(idCar, description)
这样,就无法插入任何重复项——即使有人试图使用Excel或其他工具连接到您的数据库,也可以通过if NOT EXISTS检查绕过SQL insert语句。如果您不能使用索引(为什么不?家庭作业要求??),则可以在插入前检查记录是否已存在,并且仅在不存在时插入:
IF NOT EXISTS(SELECT * FROM dbo.cardescription
WHERE idCar = @idCar AND Description = @description)
INSERT INTO dbo.carsdescription(description, idCar)
VALUES(@description, @idCar)
ELSE
RAISERROR(N'Duplicate record - INSERT aborted', 16, 1)
在中读取RAISERROR-这将导致调用.NET应用程序中出现异常
但是使用唯一索引的解决方案肯定会更好
CREATE UNIQUE NONCLUSTERED INDEX UIX01_Cardescription
ON dbo.CarDescription(idCar, description)
这样,就无法插入任何重复项-即使有人试图使用Excel或其他工具连接到您的数据库,使用if NOT EXISTS检查绕过您的SQL insert语句。就数据库而言,这是允许的事务,因此如果您无法更改数据库中的约束(通过添加索引或触发器),您需要在应用程序中执行此操作 首先 如果返回true,则让代码抛出异常,如果不是,则执行插入
在Oracle中,您可以编写一个pl/sql过程,为select的结果设置一个变量,根据结果执行insert或抛出一个异常,就数据库而言,这是一个允许的事务,因此如果您无法更改数据库中的约束,那么(通过添加索引或触发器),您需要在应用程序中执行此操作 首先 如果返回true,则让代码抛出异常,如果不是,则执行插入
在Oracle中,您可以编写一个pl/sql过程,为select的结果设置一个变量,根据结果执行insert或抛出一个异常(索引是不允许的:),第二个squery不会抛出异常……我认为关键是首先执行查询,如果它返回,则抛出一个异常urns true(我将使用EXISTS),否则,请执行插入。为什么不使用索引?这就是它的用途!不允许使用索引:/并且第二个squery不会引发异常…我认为重点是首先执行查询,如果返回true则引发异常(我将使用EXISTS),否则,请执行插入。为什么不使用索引?这就是它的用途!如果您使用的是SQL Server,请参阅marc_的解决方案如果您使用的是SQL Server,请参阅marc_的解决方案