2011-02-02 191 views
1

我有一个SQL DB与各种表保存有关产品(这是一个网上商店)的信息,我用C#编码。有一些选项与给定产品相关联,并且如前所述,有关这些选项的信息在保存时分布在几张表格中。检查项目是否存在保存

现在,当我在CMS中编辑本产品时,可以看到现有产品选项的列表,并且可以添加到该列表或从中删除,就像您期望的那样。

当我保存产品时,我需要检查记录是否已经存在,如果有,更新它,如果没有,则保存新记录。我试图找到一个有效的方式来做到这一点。保持与产品选项相关的ID是非常重要的,因此每次清除它们并重新保存它们是不可行的。

再次描述,可能更清楚:想象一下,当我加载产品时,我有一个选项集合,这个选项被加载到内存中,并根据用户的选择加载/删除。当他们点击“保存”时,我需要检查哪些选项是更新以及哪些是新的列表。

任何建议这样做的有效方法?

谢谢。

回答

1

如果您希望实现的效率与数据库的往返次数有关,那么您可以编写一个存储过程来为您执行更新或插入操作。

但是,在大多数情况下,如果您在表格上有适当的主键或唯一索引,则应该非常快速地避免SELECT首先出现。

如果效率是在服务器端优雅或减少代码方面,那么我会看看使用某种ORM,例如实体框架4.0。使用适当的ORM体系结构,您几乎可以停止根据数据库记录和INSERT/UPDATE进行思考,只需处理内存中的对象集合即可。

0

运行选择查询检查ID。如果它存在,那么你需要更新。如果它不存在,那么你需要插入。

没有更多的细节我真的不知道还有什么要告诉你。这是相当标准的。

+0

感谢您的反馈,对我来说,总是显得乏味,当某些东西显得乏味时,我倾向于认为我错过了一个更好的更有效的方式。很高兴知道我不是,尽管这意味着它需要一段时间。 – scaryjones 2011-02-03 11:39:06

1

我通常这样做是通过执行以下步骤:

  1. 对于每个项目,执行更新查询,如果它存在,将更新的项目。
  2. 每次更新后,检查更新了多少行(在SQL Server中使用@@ ROWCOUNT)。如果零行更新,则执行插入操作以创建该行。

或者,你可以做相反的,如果你创建一个唯一约束,以防止重复行:

  1. 对于每个项目,试图将其插入。
  2. 如果插入由于约束而失败(检查错误代码),请改为执行更新。
+0

感谢您的反馈意见,对我来说,这似乎很乏味,当某些事情显得单调乏味时,我倾向于认为我错过了一个更好的更有效的方式。很高兴知道我不是,尽管这意味着它需要一段时间。 – scaryjones 2011-02-03 11:18:14

+0

如果您使用的是SQL Server,则可能需要使用MERGE命令。它可能会做你正在做的事情。但是,调试并不容易,这就是为什么我倾向于避免它。 – 2011-02-03 12:03:29