2009-10-28 60 views
0

我在一个唯一的列上插入一个插入,系统返回一个错误,说我不能插入重复的行。我怎样才能忽略C#中的这个错误?如何忽略SQL错误? - C#

编辑 不使用try/catch语句

this question我为什么要忽略错误。

+0

你为什么要忽略它?你最好不要插入重复的行。 – recursive 2009-10-28 03:10:40

+0

我正在实现每个文章ID都有唯一IP的点击数数据库。我试图避免提出两个疑问。这就是为什么我想忽略这些错误。 – Luke101 2009-10-28 03:16:12

+0

SQL Server是否支持INSERT ... ON DUPLICATE KEY UPDATE样式语法?这听起来像你所需要的。 – 2009-10-28 03:23:24

回答

0

使用Try/Catch并对catch执行任何操作。

当然这意味着记录不会被插入,也不会像@recursive提到的那样解决潜在的问题,但它会忽略错误。

如果你想插入一个新行然后摆脱导致这种情况发生的属性值,如Id字段或其他东西。

编辑

如果它是一个命中次数,那么你想要做一个更新查询,我认为是你来自哪里。你不想做一个检查,然后插入/更新权利?

我想你可能会更好使用数据存储库并将对象保留在内存中。如果有一个id分配给对象,那么你在计数器上进行更新,如果没有,那么插入一个,然后你将ID存储在对象中。

Google Analytics(分析)可以检查页面上的点击次数? Lot很容易,大多数免费且几乎没有代码。那是可行的吗?

+0

是否有可能没有try/catch?我的代码的这个区域会被执行几次 – Luke101 2009-10-28 03:16:56

0

如果你想忽略它,抓SQLEXCEPTION把它吞了......

try 
    { 

     // code that calls the database insert 
    } 
    catch(SqlException) { /* swallow */ } 

如果你可以切换到使用一个存储过程,然后简单地窝插入一个条件块,检查里面对于受骗者第一...

If Not Exists (Select * From Table 
       Where PK = @PkValue) 
    Insert Table (ColNames here) 
    Values(input parameters here, including PKvalue) 
+1

错字中的catch – 2009-10-28 03:15:10

+1

什么?没有SqException?谢谢!修正它... – 2009-10-28 13:05:29

+0

是否有可能没有尝试/赶上?我的代码的这个区域将被执行多次 – Luke101 2009-10-28 15:42:54

0

用途:

try { 
    ...sql statement execution... 
} catch (SqlException ex) { 
    ..do stuff here... 
} 
+0

是否有可能没有try/catch?我的代码的这个区域将被执行多次 – Luke101 2009-10-28 15:41:46

0

实在没有办法瓦特/出做一个初始选择或尝试捕获...

如果您使用支持存储过程的数据库,则可以通过在存储过程中执行select操作,然后仅在存在没有记录。

还有一篇关于您链接到的文章的建议,值得一试,您可以使用where子句编写插入内容。我不确定语法是否正确,但可能值得一试。

Insert TableName ([column list]) 
Select Distinct @PK, @valueA, @ValueB, etc. -- list all values to be inserted 
From TableName 
Where Not Exists 
    (Select * From TableName 
    Where PK == @PK) 
0

以如下方式使用存储过程。请注意,error_number()来自定义的错误 - 当它插入具有唯一键的副本或PK约束时。谷歌如果你想了解更多关于具体号码的细节

BEGIN TRY 
    insert into table values(x,y,x) 
END TRY 
BEGIN CATCH 
    IF ERROR_NUMBER() = 2627 OR ERROR_NUMBER() = 2601 
      -- this is a duplicate so just do nothing 
    ELSE 
     RAISERROR ('Error with Insert', -- Message text. 
      16, -- Severity. 
      1 -- State. 
      ); 
END CATCH