Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在windows mobile 5上将数据加载到Sql CE数据库的最快方法_C#_Sql_Windows Mobile_Sql Server Ce - Fatal编程技术网

C# 在windows mobile 5上将数据加载到Sql CE数据库的最快方法

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中的某些项很可能已经存在于数据库中,如果存在,则需要更新。所以批量复制/插入

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

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

到目前为止,它的性能还不错,但我想知道是否有更快/更好的方法可以提高性能

我看过一些批量插入,但据我所知,这只适用于插入。我的IEnumerable中的某些项很可能已经存在于数据库中,如果存在,则需要更新。所以批量复制/插入是不行的,对吗

任何答案都将不胜感激

非常感谢,

埃特费尔法克斯

编辑:这是我最后得到的代码。性能的提高是惊人的。我已经从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);
                    }
                }
            }
        }
    }
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的答案是适用的。