У меня есть проект C #, который использует sqlserver Compact Edition и Entity Framework для доступа к данным. У меня есть необходимость вставить или обновить большое количество строк, 5000+ или более в БД, поэтому, если ключ существует, обновите запись, если не вставьте ее. Я не могу найти способ сделать это с компактной версией и EF без ужасной производительности, то есть занимает 2 минуты плюс на компьютере с ядром i7. Я попытался найти запись, чтобы увидеть, существует ли она, затем вставить, если нет, или обновить, если это так, поиск является убийцей в этом. Я попытался составить поисковый запрос, и это дало лишь небольшое улучшение. Еще одна вещь, которую я пробовал, - вставка записи в попытку и попытка обновления, но это вынуждает меня сохранять изменения в каждой записи, чтобы получить исключение, а не в конце, что приводит к снижению производительности. Очевидно, я не могу использовать хранимые процедуры, так как это компактная версия. Также я рассмотрел просто выполнение t-sql напрямую на БД, но отсутствие операторов процесса в компакте, кажется, исключает это. Я искал по всему миру идеи. Я действительно хотел использовать компактный, если я могу чрезмерно выразить преимущества развертывания и возможность предотвратить копание пользователем базы данных. Любые предложения будут оценены.
Спасибо
Может быть, вы могли бы получить результат, который вы ищете, используя простые запросы. Допустим, таблица, в которую вы хотите вставить или обновить, выглядит следующим образом
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 в этом отношении), мы всегда сначала вызываем обновление, а затем вызываем вставку, если обновление дает количество строк, равное 0. Это очень просто реализовать и не требует затрат. .catch блоки для управления потоком.