好的,就这样吧。我面临的要求是我在数据库中有一个表“MyDbTable”,其中包含大量数据。
让我们说它有三列,如:
ColA ColB ColC
1 A AB
2 b bc
3 c cd
ColA是身份
现在我调用一个Web服务,预期结果包含大约1500行。
架构与返回的结果相同:
ColA ColB ColC
1的xy
3c中YZ
图4c YZ
现在我真正想做的是检查我在服务结果中的现有记录并在MyDbTable中更新它们,在这种情况下,它将是ColA中1和3的记录。我将不得不更新它们。对于具有ColA值4的记录,webservice结果是新的,所以我必须插入它。
现在的问题是MyDbTable有数千行,服务也会返回多行。
我知道最简单的方法是使用我们遍历每条记录,检查它然后通过应用程序或存储过程来处理它的蛮力。
我真正想知道的是如何以最优化的方式做到这一点。
答案 0 :(得分:1)
这就是我认为是最有效的方法(尽管没有测量它):
使用SqlBulkCopy Class
提供的批量复制操作,将从Web服务返回的整个表复制到数据库的临时表中。
使用单个SQL Server MERGE
statement进行"更新或插入"从临时表到真实表的操作。
如果您使用的是早于2008的SQL Server版本,则可以使用an UPDATE statement with an OUTPUT clause代替MERGE
。
答案 1 :(得分: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,并使用登台表,您可以执行适合您所有需要的Inser / Update。
您可以执行以下操作:在临时表和实际表中的所有ID都应在BulkInsert之后删除,然后将所有记录从分段复制到实际。
Using SQLBulkCopy to Insert/Update database
我希望以上链接有所帮助。