0

好的,就这样吧。我面临的要求是我在数据库中有一个表说“MyDbTable”,其中有很多数据。

可以说它具有三列,例如:

ColA ColB ColC

1 a ab
2 b bc
3 c cd


ColA 是身份

现在我调用一个 web 服务,预期结果包含大约 1500 行。

模式与返回的结果相同说:

ColA ColB ColC

1 a xy
3 c yz
4 c yz

现在我真正想做的是检查我在服务结果中的现有记录并在 MyDbTable 中更新它们,在这种情况下,它将是 ColA 中具有 1 和 3 的记录。我将不得不更新它们。对于 web 服务结果中 ColA 值为 4 的记录是新的,所以我必须插入它。

现在的问题是 MyDbTable 有数千行,并且服务也返回了许多行。

我知道最简单的方法是暴力破解,我们通过应用程序或存储过程遍历每条记录,检查它然后处理它。

我真正想知道的是如何以最优化的方式做到这一点。

4

2 回答 2

1

这是我认为是最有效的方法(虽然还没有测量过):

  1. 使用批量复制操作(例如SqlBulkCopy Class.

  2. 使用单个 SQL ServerMERGE语句从临时表到实际表中进行“更新或插入”操作。

如果您使用的是早于 2008 年的 SQL Server 版本,则可以使用带有 OUTPUT 子句的 UPDATE 语句而不是MERGE.

于 2012-11-30T06:05:36.713 回答
0

好吧,你可以做一件事......

从 Web 服务获取第一行并获取它的 ID 说“1”并将其传递给 GetRecordFromDB 方法...

现在,如果该方法返回某个对象,则将其值设置为您从 Webservice 中找到的那些值。然后调用一个方法来更新数据库中的记录。

所以代码逻辑是

object updateorinsert = library.getobjectbyid(IDFROMFirstRecordOfWebservice)
if (updateorinsert  != null)
   {
           updateorinsert.ColAValue = WebserviceData.ColAValue
   }

  updateorinsert.ColBValue = WebserviceData.ColBValue
  updateorinsert.ColCValue = WebserviceData.ColCValue

library.UpdateRecordOrInsertInDB(updateorinsert);

您也可以使用 SqlBulkCopy 并使用临时表执行适合您所有需要的插入/更新。

您可以在 BulkInsert 之后删除暂存表和实际表中的所有 ID,然后将所有记录从暂存表复制到实际表中。

使用 SQLBulkCopy 插入/更新数据库

我希望上面的链接有帮助。

于 2012-11-29T15:18:59.910 回答