1

这是一个直接的需求,但我想知道您在性能和设计方面有什么建议。

当你需要做某事时,什么会更快更好?检查你是否可以,如果你能做到。或者直接试一试,万一失败,你就明白了。

这是我的特殊情况:我有一个将使用 foreach 填充的数据库表。该表有一个不能在表中重复的主键。

所以..

foreach(object in Objects)
{
   bool exists = //SQL SELECT to check if exists.
   if (exists == false)
   {
      //SQL INSERT
      return INSERTED
    }
   else 
    {
     return failed
    }
}

或者

    foreach(object in Objects)
    {
       try 
          {
          //SQL INSERT
          return INSERTED
           }
       catch
         {
        return FAILED
         }

    }

我想知道这在其他方面的最佳实践,比如在没有覆盖属性的情况下创建文件并管理 execpiton 或在尝试之前检查文件是否存在。

更新: 根据答案,我知道我不应该为每个插入进行交易,因为性能。我应该做一个批量插入。在我的代码中,我有这样的东西

//SQL Start Transaction
foreach
{
//SQL INSERT
}
//SQL Commit transaction

我的问题是关于事务内部的,如果我应该在插入之前检查还是只是尝试。

4

3 回答 3

3

异常的构造成本比布尔值高得多。

一些一般准则是仅对实际异常的行为使用异常(您不希望它是正常事件),并避免将异常用于程序控制。

于 2013-01-30T04:43:07.623 回答
1

通过 C# 进行的大量数据库操作非常低效且耗时。当我处理这个问题时,我通常不是检查,而是将插入构建到一个查询中;例如:

"INSERT INTO sitemaps (link, site) 
 (SELECT ('" + NAME2 + "') as link, '" + SITE + "' as site 
   WHERE NOT EXISTS 
 (SELECT link FROM sitemaps 
    WHERE link = '" + NAME2 + "' and site='" + SITE + "')"

这减轻了数据库的负担并减少了编码。

另一种选择,提高插入性能(字面意思是数百倍)的非常好的方法是使用BULK INSERT(仅限 MS SQL)到临时数据库表中(一次非常快地处理数千条记录);然后,在数据库端,使用MERGE命令并编写 if-else 场景如何处理更新、插入、删除等。将前后部分移到数据库程序端始终是一个好习惯。

于 2013-01-30T02:30:11.867 回答
0

如果您想在 C# 中执行此操作,我建议您制作一个HashSet主键,然后在尝试添加它们之前检查对象。

注意:您应该确保不会在每次插入时都向数据库发送查询,因为这将比和之间的任何差异得多。try/catchif

进行插入的最快方法是将它们批处理到单个数据库调用中。

于 2013-01-30T03:03:10.980 回答