繁体   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