在sql server compact edition上执行Insert OR Update(upsert)

c# entity-framework sql sql-server-ce upsert

我有c#项目正在使用sqlserver压缩版和实体框架进行数据访问。我需要向db插入或更新大量5000+或更多的行,因此如果密钥存在,则更新记录(如果不插入)。我无法找到一种方法来实现这一点与紧凑版和EF具有可怕的性能,即在核心i7计算机上花费2分钟。我已经尝试搜索记录,看它是否存在,然后插入,如果没有,或更新,如果它,搜索是杀手。我已经尝试编译搜索查询,但只做了一点改进。我尝试的另一件事是在try catch中插入记录,如果更新失败,但这迫使我在每条记录上保存更改以获得异常,而不是在最后是性能杀手。显然我不能使用存储过程,因为它是紧凑版。另外我看过只是在db上直接执行t-sql,但是在compact中缺少进程语句似乎排除了这一点。我在全世界范围内搜寻和思考。我真的想使用紧凑型,如果我可以过度表达部署的好处和能力,以防止用户挖掘数据库。任何建议将不胜感激。

谢谢

一般承认的答案

也许你可以通过简单的查询获得你寻求的结果。假设要插入或更新的表是这样的

TABLE original
     id integer,
     value char(100)

首先,您可以使用新值创建临时表(您可以使用SELECT INTO或其他方法来创建它)

TABLE temp
    id integer,
    value char(100)

现在,您需要做两件事,更新原始行,然后插入新值

UPDATE original 
SET original.value = temp.value
FROM original, temp
WHERE original.id = temp.id

INSERT INTO original 
SELECT * from temp 
WHERE temp.id not IN (select o.id from original o)

热门答案

当我们使用SQL CE(和SQL 2005 Express)时,我们总是首先调用更新,然后在udate给出行数为0的情况下调用插入。这很容易实现,并且不需要花费尝试。 .catch块用于控制流程。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因