C# 在windows mobile 5上将数据加载到Sql CE数据库的最快方法
我正在WindowsMobile5上开发一个应用程序,其中应用程序的一部分从IEnumerable中加载数据(2000+) 目前,我正在检查数据库中是否存在Id,并根据结果执行Insert或Update语句(使用SqlCeCommand的ExecuteNonQuery方法) 到目前为止,它的性能还不错,但我想知道是否有更快/更好的方法可以提高性能 我看过一些批量插入,但据我所知,这只适用于插入。我的IEnumerable中的某些项很可能已经存在于数据库中,如果存在,则需要更新。所以批量复制/插入是不行的,对吗 任何答案都将不胜感激 非常感谢, 埃特费尔法克斯 编辑:这是我最后得到的代码。性能的提高是惊人的。我已经从30秒保存1000条记录变成了眨眼之间。请随时提出进一步的改进建议C# 在windows mobile 5上将数据加载到Sql CE数据库的最快方法,c#,sql,windows-mobile,sql-server-ce,C#,Sql,Windows Mobile,Sql Server Ce,我正在WindowsMobile5上开发一个应用程序,其中应用程序的一部分从IEnumerable中加载数据(2000+) 目前,我正在检查数据库中是否存在Id,并根据结果执行Insert或Update语句(使用SqlCeCommand的ExecuteNonQuery方法) 到目前为止,它的性能还不错,但我想知道是否有更快/更好的方法可以提高性能 我看过一些批量插入,但据我所知,这只适用于插入。我的IEnumerable中的某些项很可能已经存在于数据库中,如果存在,则需要更新。所以批量复制/插入
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);
}
}
}
}
}
public void合并数据(IEnumerable实体)
{
使用(var cmd=GlobalConnection.Instance.Connection.CreateCommand())
{
cmd.CommandType=CommandType.TableDirect;
cmd.IndexName=“PK_389;”+this.TableName;
cmd.CommandText=this.TableName;
使用(SqlCeResultSet SqlCeResultSet=cmd.executesultset(ResultSetOptions.updateable))
{
foreach(var entityToSave in entities)
{
bool recordAlreadyExists=sqlCeResultSet.Seek(DbSeekOptions.FirstEqual,entityToSave.Id);
如果(recordAlreadyExists)
{
//更新
sqlCeResultSet.Read();
PopulateForUpdate(sqlCeResultSet,entityToSave);
sqlCeResultSet.Update();
}
其他的
{
//插入
SQLCEUpdateableRecord insertRecord=sqlCeResultSet.CreateRecord();
PopulateForInsert(insertRecord,entityToSave);
Insert(insertRecord);
}
}
}
}
}
如果只使用一个表,使用TableDirect而不是查询处理器可能会使性能提高10倍。只要在ID索引上查找,如果行存在,则更新,否则插入。使用SqlCeResultSet进行遍历。谢谢您的回复。你能帮我澄清一下吗?我应该在流程的哪一部分使用TableDirect?我想您的意思是我应该使用TableDirect/Seek来帮助确定ID是否已经存在,并且我仍然应该使用SqlCeCommand来执行实际的插入/更新。是吗?这篇文章帮助我找到了上述问题的答案。是的,使用TableDirect的答案是适用的。