Самый быстрый способ загрузки данных в базу данных Sql CE на Windows Mobile 5 - PullRequest
3 голосов
/ 26 февраля 2011

Я разрабатываю приложение для Windows Mobile 5, в котором часть приложения загружает данные (более 2000) из IEnumerable.

В данный момент я проверяю, существует ли идентификатор в базе данных, и в зависимости от результата я выполняю оператор вставки или обновления (используя метод ExecuteNonQuery в SqlCeCommand).

Пока что он работает просто отлично, но мне интересно, есть ли более быстрый / лучший способ сделать это, который может повысить производительность.

Я смотрел на какую-то групповую вставку,но из того, что я понимаю, это будет работать только для вставок.Есть большая вероятность, что некоторые элементы в моем IEnumerable <> уже будут существовать в базе данных, и в этом случае потребуется обновление.Так что массового копирования / вставки не будет - это правильно?

Любые ответы приветствуются.

Большое спасибо,

ETFairfax.

РЕДАКТИРОВАТЬ: Это код, с которым я закончил.Увеличение производительности удивительно.Я потратил 30 секунд, чтобы сохранить 1000 записей, и это мгновение ока.Не стесняйтесь предлагать дальнейшие улучшения ....

public void MergeData(IEnumerable<T> entities)
    {   
        using (var cmd = GlobalConnection.Instance.Connection.CreateCommand())
        {
            cmd.CommandType = CommandType.TableDirect;
            cmd.IndexName = "PK_" + this.TableName;
            cmd.CommandText = this.TableName;

            using (SqlCeResultSet sqlCeResultSet = cmd.ExecuteResultSet(ResultSetOptions.Updatable))
            {
                foreach (var entityToSave in entities)
                {
                    bool recordAlreadyExists = sqlCeResultSet.Seek(DbSeekOptions.FirstEqual, entityToSave.Id);

                    if (recordAlreadyExists)
                    {
                        //Do an Update
                        sqlCeResultSet.Read();

                        PopulateForUpdate(sqlCeResultSet, entityToSave);

                        sqlCeResultSet.Update();
                    }
                    else
                    {
                        //Do an Insert
                        SqlCeUpdatableRecord insertRecord = sqlCeResultSet.CreateRecord();

                        PopulateForInsert(insertRecord, entityToSave);

                        sqlCeResultSet.Insert(insertRecord);
                    }
                }
            }
        }
    }

1 Ответ

1 голос
/ 26 февраля 2011

Использование TableDirect вместо процессора запросов, вероятно, даст вам 10-кратное улучшение производительности, если вы используете только одну таблицу. Просто найдите идентификатор индекса, если строка существует, Обновить, иначе Вставить. Используйте SqlCeResultSet для обхода.

...