我正在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);
}
}
}
}
}
答案 0 :(得分:1)
如果只打一个表,使用TableDirect而不是查询处理器可能会使性能提高10倍。只需查找ID索引,如果该行存在,则更新,否则插入。使用SqlCeResultSet进行遍历。