插入记录并抛出异常

时间:2010-03-03 16:24:51

标签: c# sql duplicates

如果cardescription位于具有特定@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(PK,int,autoincrement)
  • idcar(FK,int)
  • 描述(VARCHAR)

汽车表:

  • Id(int,PK,autoincrement)
  • 名称(为nvarchar(255)

4 个答案:

答案 0 :(得分:3)

您应该在IDCar和Description上创建唯一索引。然后您的数据库将阻止插入重复数据。然后,您的CommandObject将抛出异常。

insert into carsdescription(IDCar, description) 
values (@idCar, @description)

但是为了对你的用户好一点,你应该首先在你的表中查找是否有重复的条目。

select count(*) from  carsdescription where IDCar = @idCar and decription = @description

修改

出于某些原因,不允许进行架构更改。这意味着,您的数据库无法保护您免受重复条目的影响。因此,正如马修正确指出的那样,你必须:

  • 首先:执行select语句。如果count大于0,则抛出异常
  • 第二:插入

答案 1 :(得分:1)

如果你不能使用索引(为什么不?作业要求??),那么你可以在插入之前检查,记录是否已经存在,只有在它不存在时才插入:

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)

MSDN tech library中读取RAISERROR - 这将在调用.NET应用程序中导致异常。

但是具有唯一索引的解决方案肯定会更好!

CREATE UNIQUE NONCLUSTERED INDEX UIX01_Cardescription
   ON dbo.CarDescription(idCar, description)

这样,就没有办法插入任何重复项 - 即使有人设法使用Excel或其他工具连接到您的数据库,使用IF NOT EXISTS检查绕过SQL INSERT语句。

答案 2 :(得分:0)

INSERT没有WHERE,在查询中使用SELECT语句来使用WHERE。

insert into carsdescription
 (description) 
SELECT (@description) FROM carsdescription
 where idCar=@idCar;

答案 3 :(得分:0)

就数据库而言,这是一个允许的事务,因此如果您无法更改数据库中的约束(通过添加索引或触发器),则需要在应用程序中执行此操作。

第一

Select exists(*) from carsdescription where IDCar = ? and description = ?

如果返回true,请让代码抛出异常,如果不是,请执行insert。

您没有说出您正在使用的RMDBS。在Oracle中,您可以编写一个pl / sql过程,该过程将变量设置为select的结果,根据结果执行插入或抛出异常