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)
Cars表:

  • Id(整数、主键、自动递增)
  • 姓名(nvarchar(255)

插入没有WHERE,请在查询中使用SELECT语句来使用WHERE

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,则引发异常
  • 第二:做插入

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

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_的解决方案