Exécution de l'insertion OU de la mise à jour (upsert) sur l'édition compacte du serveur SQL

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

Question

J'ai un projet c # qui utilise sqlserver compact edition et un framework d'entités pour l'accès aux données. J'ai besoin d'insérer ou de mettre à jour un grand nombre de lignes, 5000 ou plus dans la base de données, donc si la clé existe, mettez à jour l'enregistrement sinon insérez-le. Je ne peux pas trouver un moyen de faire cela avec l'édition compacte et EF avec des performances horribles, c'est-à-dire en prenant 2 minutes plus sur un ordinateur Core i7. J'ai essayé de rechercher l'enregistrement pour voir s'il existait, puis en l'insérant dans le cas contraire ou dans une mise à jour si tel est le cas, la recherche est le tueur à ce sujet. J'ai essayé de compiler la requête de recherche et cela ne donnait qu'une légère amélioration. Une autre chose que j'ai essayée est d'insérer le disque dans un catch try et s'il échoue la mise à jour, mais cela me force à économiser sur chaque disque pour obtenir l'exception par opposition à la fin qui tue la performance. Évidemment, je ne peux pas utiliser de procédures stockées car il s'agit d'une édition compacte. En outre, j’ai envisagé d’exécuter t-sql directement d’une manière ou d’une autre sur la base de données, mais l’absence d’énoncés de processus dans Compact semble exclure cela. J'ai cherché dans le monde entier et à court d'idées. Je voulais vraiment utiliser compact si je pouvais trop exprimer les avantages du déploiement et la capacité d'empêcher l'utilisateur de chercher dans la base de données. Toute suggestion serait appréciée.

Merci

Réponse acceptée

Vous pourriez peut-être obtenir le résultat que vous recherchez en utilisant des requêtes simples. Disons que la table que vous voulez insérer ou mettre à jour est comme ceci

TABLE original
     id integer,
     value char(100)

vous pouvez d’abord créer une table temporaire avec les nouvelles valeurs (vous pouvez utiliser un SELECT INTO ou d’autres méthodes pour le créer)

TABLE temp
    id integer,
    value char(100)

maintenant, vous devez faire deux choses, mettre à jour les lignes dans l'original et ensuite insérer les nouvelles valeurs

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)

Réponse populaire

Lorsque nous utilisons SQL CE (et SQL 2005 Express d'ailleurs), nous appelons toujours une mise à jour en premier, puis une insertion si la date de mise à jour donne un nombre de lignes égal à 0. Cette opération est très simple à mettre en oeuvre et ne nécessite pas de frais. .catch blocs pour le flux de contrôle.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow