C# 如何忽略SQL错误?-C

C# 如何忽略SQL错误?-C,c#,sql-server-2005,C#,Sql Server 2005,我在一个唯一的列上进行插入,系统返回一个错误,说我不能插入重复的行。如何在C中忽略此错误 编辑 不使用try/catch 请参阅以了解我为什么要忽略此错误。使用Try/Catch并在Catch上不执行任何操作 当然,这意味着不会插入记录,也不能解决@recursive提到的潜在问题,但会忽略错误 如果您想插入一个新行,那么就去掉导致这种情况发生的属性值,比如Id字段或其他 编辑 如果是一个命中率,那么你需要做一个更新查询,我想这就是你的来源。你不想做一个检查,然后插入/更新,对吗 我认为您最好使

我在一个唯一的列上进行插入,系统返回一个错误,说我不能插入重复的行。如何在C中忽略此错误

编辑 不使用try/catch


请参阅以了解我为什么要忽略此错误。

使用Try/Catch并在Catch上不执行任何操作

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

如果您想插入一个新行,那么就去掉导致这种情况发生的属性值,比如Id字段或其他

编辑

如果是一个命中率,那么你需要做一个更新查询,我想这就是你的来源。你不想做一个检查,然后插入/更新,对吗

我认为您最好使用数据存储库并将对象保存在内存中。如果有一个id分配给该对象,则在计数器上执行更新,如果没有,则执行插入,并将该id与该对象一起存储


那么像谷歌分析这样的工具如何检查页面点击率呢?很多更容易,大部分是免费的,几乎没有代码。这可能是可行的吗?

如果要忽略它,请捕获一个SqlException并将其吞下

  try 
  {

      // code that calls the database insert
  }
  catch(SqlException) { /* swallow */ }
如果您可以切换到使用存储的进程,那么只需将insert嵌套在条件块中,这将首先检查重复

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


做一个初始选择或者做一个尝试捕捉真的没有出路

如果您使用的是支持存储过程的数据库,则可以通过在存储过程中执行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)

按以下方式使用存储的过程。请注意,错误编号来自定义的错误-插入具有唯一键的副本或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

你为什么要忽略它?您最好不要插入重复的行。我正在为每个文章id实现一个具有唯一ip的命中计数数据库。我正在尝试避免进行两次查询。这就是我希望忽略错误的原因。SQL Server是否支持重复密钥更新时插入…的语法?克里斯:是的,但是只有2008:我会考虑为数据库中的IP地址选择一个索引友好格式。如果你在谷歌上搜索,你会发现很多关于这个话题的讨论。然后索引该列,并在插入之前检查该IP是否存在。如果你做对了,你的表现会显著提高。然而,捕获和忽略SQL错误是一件可怕的事情。首先,您可能忽略了错误的错误。是否可以不使用try/catch?我的代码的这个区域将被执行多次。不使用try/catch可以吗?我的代码的这个区域将被执行多次。不使用try/catch可以吗?我的代码的这个区域将执行几次,而不使用存储的proc-No,SqlException将在数据库中创建,并发送到此代码。你必须抓住它,否则应用程序将崩溃。解决方法是编写一个存储过程,在尝试插入之前检查重复项,因此可以忽略插入重复项的请求。
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