簡體   English   中英

在Windows Mobile 5上將數據加載到Sql CE數據庫的最快方法

[英]Fastest way to load data into Sql CE database on windows mobile 5

我正在Windows Mobile 5上開發一個應用程序,其中部分應用程序從IEnumerable加載一堆數據(2000+)。

目前我正在檢查數據庫中是否存在Id,並且根據結果我正在執行Insert或Update語句(使用SqlCeCommand的ExecuteNonQuery方法)。

到目前為止,它表現得還不錯,但我想知道是否有更快/更好的方法來做到這一點,這可能會提升性能。

我看過某種Bulk Insert,但據我所知,這只適用於插入。 我的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);
                    }
                }
            }
        }
    }

如果只打一個表,使用TableDirect而不是查詢處理器可能會使性能提高10倍。 只需查找ID索引,如果該行存在,則更新,否則插入。 使用SqlCeResultSet進行遍歷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM