【发布时间】:2018-10-28 23:19:14
【问题描述】:
我将在给定时间接收大约 1000 条记录,我必须确定它们是现有记录还是新记录。
如果它们存在,我必须更新记录,如果是新记录,则只需插入它们。我不知道它们中的任何一个是否会存在,或者它们是否都会存在。
我认为最好对数据库进行一次查询并尝试查找它们中的任何一个是否存在于数据库中并将它们存储在内存中并检查内存中的集合并进行检查。
最初有人告诉我,我 1 个字段就足以确定唯一性。所以我以为我可以针对数据库中的 1 个字段执行 1 个大 in 子句,但现在我发现情况并非如此,我需要使用 3 个字段来确定记录是否存在或现在。
这基本上是一个and子句
select * from where columnA = "1" and ColumnB = "2" and ColumnC = "3"
如何在 C# ado.net 中正确解决这个问题?
我猜我需要有一些超级 where 子句?
select * from where (columnA = "1" and ColumnB = "2" and ColumnC = "3") or (columnA = "4" and ColumnB = "5" and ColumnC = "6") or [....998 more conditional clauses)
如果可能的话,我愿意接受更好的想法。我仍然认为一次性完成比执行 1000 个单独的查询要好。
【问题讨论】:
-
您使用的是什么 rdbms?例如,SQL Server 支持表值参数,因此您应该能够使用单个存储过程完成所有操作。 (Read here 关于如何以线程安全的方式进行操作)
-
将使用 sql serer 2017 但在本地必须使用 2014,因为没有 Windows 10。
-
那么我建议使用表值参数而不是动态创建 where 子句。大量关于 stackoverflow 和一般网络的示例。
-
所以这个表值参数 SP 将返回给我的 C# 重复的结果?
-
是的,很容易。您也可以在存储过程中执行 upsert,而不必先返回 c#。
标签: c# sql-server ado.net