c# - 在 Windows Mobile 5 上将数据加载到 Sql CE 数据库的最快方法

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

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

目前我正在检查数据库中是否存在 Id,并根据结果执行 Insert 或 Update 语句(使用 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);
                    }
                }
            }
        }
    }

最佳答案

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

关于c# - 在 Windows Mobile 5 上将数据加载到 Sql CE 数据库的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5128265/

相关文章:

c# - Blazor - 在删除/更新之前显示确认对话框?

MySQL 搜索一个字段但删除所有非数字字符

android - SOAP 和 RESTFUL 之间的主要区别以及哪个适合 Native 移动应用程序?

C# 启动进程在 Pocket PC Windows CE 上最小化/隐藏

c# - 如何在属性中搜索特定值?

c# - SQL查询获取整数的十六进制值的Int值

c# - 统计整个文件从 '<'到 '>'之间的字符数

sql - 如何使同一项目的多次出现与第一次出现的值不同?

mysql - MySQL中的语法错误,但是在创建ROLE时语法正确

c# - 如何防止windows mobile图片框闪烁