【问题标题】:Fastest way to load data into Sql CE database on windows mobile 5在 windows mobile 5 上将数据加载到 Sql CE 数据库中的最快方法
【发布时间】:2011-07-04 22:29:19
【问题描述】:

我正在 Windows Mobile 5 上开发一个应用程序,其中应用程序的一部分从 IEnumerable 加载数据负载 (2000+)。

目前我正在检查 Id 是否存在于数据库中,并根据结果执行插入或更新语句(使用 SqlCeCommand 的 ExecuteNonQuery 方法)。

到目前为止,它的性能还不错,但我想知道是否有更快/更好的方法来做到这一点,这可能会提高性能。

我看过某种批量插入,但据我了解,这仅适用于插入。我的 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);
                    }
                }
            }
        }
    }

【问题讨论】:

    标签: c# sql windows-mobile sql-server-ce


    【解决方案1】:

    如果您只处理一个表,使用 TableDirect 代替查询处理器可能会使您的性能提高 10 倍。只需在 ID 索引上查找,如果该行存在,则更新,否则插入。使用 SqlCeResultSet 进行遍历。

    【讨论】:

    • 感谢您的回复。你能为我澄清一些事情吗?我应该在流程的哪个部分使用 TableDirect?我假设您的意思是我应该使用 TableDirect/Seek 来帮助确定 ID 是否已经存在,并且我仍然应该使用 SqlCeCommand 来执行实际的插入/更新。对吗?
    • 这篇stackoverflow.com/questions/4476929/how-to-improve-this-code 帖子帮助我找到了上述问题的答案。
    • 是的,使用TableDirect的答案是适用的。
    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多