Einfügen oder Aktualisieren (Upsert) für SQL Server Compact Edition

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

Frage

Ich habe ein c # -Projekt, das die sqlserver compact Edition und das Entity-Framework für den Datenzugriff verwendet. Ich habe die Notwendigkeit, eine große Anzahl von Zeilen (5000+ oder mehr) in die Datenbank einzufügen oder zu aktualisieren. Wenn also der Schlüssel vorhanden ist, aktualisieren Sie den Datensatz, wenn er nicht eingefügt wird. Ich finde keinen Weg, dies mit der Compact Edition und EF zu erreichen, und zwar mit schrecklicher Leistung, dh auf einem Core-Computer mit i7 dauert es mindestens 2 Minuten. Ich habe versucht, nach dem Datensatz zu suchen, um zu sehen, ob er existiert, und dann einzufügen, wenn nicht, oder aktualisieren, wenn dies der Fall ist. Die Suche ist der Mörder. Ich habe versucht, die Suchanfrage zu kompilieren und das hat nur eine kleine Verbesserung gebracht. Eine andere Sache, die ich versucht habe, ist das Einfügen des Datensatzes in einen Try-Catch und, falls das Update fehlschlägt, aber das zwingt mich, Änderungen an jedem Datensatz vorzunehmen, um die Ausnahme zu erhalten, anstatt am Ende einen Performancekiller zu erhalten. Natürlich kann ich keine gespeicherten Prozeduren verwenden, da es sich um eine kompakte Edition handelt. Ich habe mir auch schon angeschaut, wie man t-sql direkt auf der DB ausführt, aber das Fehlen von Prozessanweisungen in compact scheint das auszuschließen. Ich habe die Welt nach Ideen durchsucht. Ich wollte unbedingt compact verwenden, wenn ich die Vorteile der Bereitstellung und die Möglichkeit, den Benutzer daran zu hindern, in der Datenbank zu graben, übertreiben kann. Irgendwelche Vorschläge wären willkommen.

Vielen Dank

Akzeptierte Antwort

Vielleicht können Sie das gewünschte Ergebnis mit einfachen Abfragen erzielen. Nehmen wir an, die Tabelle, die Sie einfügen oder aktualisieren möchten, ist folgendermaßen

TABLE original
     id integer,
     value char(100)

Zuerst können Sie eine temporäre Tabelle mit den neuen Werten erstellen (Sie können SELECT INTO oder andere Methoden verwenden, um sie zu erstellen.)

TABLE temp
    id integer,
    value char(100)

Jetzt müssen Sie zwei Dinge tun, die Zeilen im Original aktualisieren und dann die neuen Werte einfügen

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)

Beliebte Antwort

Wenn wir SQL CE (und SQL 2005 Express für diese Angelegenheit) verwenden, rufen wir immer zuerst ein Update auf und rufen dann eine Einfügung auf, wenn udate eine Zeilenanzahl von 0 ergibt. Dies ist sehr einfach zu implementieren und erfordert keinen Aufwand. .Catch-Blöcke für den Steuerungsfluss.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum