这是一个非常需要的,但我想知道你在性能和设计方面会推荐什么。
当你需要做某事时,什么会更快更好?检查一下是否可以,如果可以的话。或者直接尝试,如果失败,你就会理解这个例子。
这是我的特例: 我有一个数据库表,我将使用foreach填充。该表有一个主键,不能在tabale中重复。
所以..
foreach(object in Objects)
{
bool exists = //SQL SELECT to check if exists.
if (exists == false)
{
//SQL INSERT
return INSERTED
}
else
{
return failed
}
}
OR
foreach(object in Objects)
{
try
{
//SQL INSERT
return INSERTED
}
catch
{
return FAILED
}
}
我想在其他方面了解这方面的最佳做法,例如创建没有覆盖propetry的文件,管理execpiton或在try之前检查文件是否存在。
更新 根据答案,我知道我不应该为每个插件进行交易,因为性能。我应该做一个批量插入。 在我的代码中,我有点像这样的
//SQL Start Transaction
foreach
{
//SQL INSERT
}
//SQL Commit transaction
我的问题是关于交易内部,如果我应该在插入之前检查或只是尝试。
答案 0 :(得分:3)
例外的建筑成本远高于布尔值。
一些通用指南仅针对实际异常的行为使用异常(您不希望将其作为正常事件),并避免使用异常进行程序控制。
答案 1 :(得分: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场景如何处理更新,插入,删除等。采取后面和后面的部分并将其移动到数据库程序结束。
答案 2 :(得分:0)
如果你想在C#中执行此操作,我建议制作一个HashSet
主键,然后在尝试添加它们之前检查对象。
注意:您应确保不使用每个插入向数据库发送查询,因为远远慢于<{1}}和{{1之间的差异 }}。
执行插入操作的最快方法是将它们批处理为单个数据库调用。