之前检查或管理异常
本文关键字:管理 异常 检查 | 更新日期: 2023-09-27 17:56:40
这是一个
迫切的需求,但我想知道你在性能和设计方面有什么建议。
当你需要做某事时,什么会更快更好?检查你是否可以,以及如果你能做到。或者直接尝试,如果失败,您就会理解执行。
这是我的特殊情况:我有一个数据库表,我将使用 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
}
}
我想知道在另一件事上的最佳实践,例如创建没有覆盖属性的文件和管理可执行文件或在尝试之前检查文件是否存在。
更新:根据答案,我知道我不应该为每个插入进行交易,因为性能。我应该做一个批量插入。在我的代码中,我有这样的东西
//SQL Start Transaction
foreach
{
//SQL INSERT
}
//SQL Commit transaction
我的问题是关于交易内部的,我是否应该在插入之前检查或只是尝试。
异常的构造成本比布尔值高得多。
一些一般准则是仅对实际异常的行为使用异常(您不希望将其作为正常事件),并避免对程序控制使用异常。
通过 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场景如何处理更新,插入,删除等。将第四部分移到数据库过程端始终是一种很好的做法。
如果你想
在 C# 中执行此操作,我建议对主键进行HashSet
,然后在尝试添加它们之前根据这些主键检查对象。
注意:您应该确保每次插入时都不会向数据库发送查询,因为这比try/catch
和if
之间的任何差异都要慢得多。
执行插入的最快方法是将它们批处理到单个数据库调用中。