C# 如何循环使用Sqlite命令来加速此Sqlite批量插入(iOS)?

C# 如何循环使用Sqlite命令来加速此Sqlite批量插入(iOS)?,c#,sqlite,xamarin.ios,C#,Sqlite,Xamarin.ios,我使用下面的代码批量插入30000行(一次插入1000行)。然而,它并没有达到可能的速度。在这个例子中,我可以看到他们只创建了一次SqliteCommand,然后重新循环,重置它并清除绑定。但是,我在iOS/Monotouch上找不到合适的方法。没有Reset()或ClearBindings()或任何类似的内容 using ( var oConn = new SqliteConnection ( "Data Source=" + DB_NAME ) ) { oConn.Open ( )

我使用下面的代码批量插入30000行(一次插入1000行)。然而,它并没有达到可能的速度。在这个例子中,我可以看到他们只创建了一次
SqliteCommand
,然后重新循环,重置它并清除绑定。但是,我在iOS/Monotouch上找不到合适的方法。没有
Reset()
ClearBindings()
或任何类似的内容

using ( var oConn = new SqliteConnection ( "Data Source=" + DB_NAME ) )
{
    oConn.Open (  );

    // Wrap the whole bulk insertion into one block to make it faster, otherwise one transaction per INSERT would be created.
    // Note that this is differen from "BEGIN TRANSACTION" which would increase memory usage a lot!
    SqliteCommand oCmd = new SqliteCommand ( "BEGIN", oConn );
    oCmd.ExecuteNonQuery (  );
    oCmd.Dispose (  );

    foreach ( MyObj oObj in aMyObjects )
    {
        oCmd = new SqliteCommand ( "INSERT INTO LocalObjects ( intID, intParentID, intObjectType, strName, dtModified VALUES (@intID, @intParentID, @intObjectType, @strName, @dtModified)", oConn );
        oCmd.Parameters.AddWithValue ( "@intID", oMyObj.ID );
        oCmd.Parameters.AddWithValue ( "@intParentID", oMyObj.ParentID );
        oCmd.Parameters.AddWithValue ( "@intObjectType", ( int ) oMyObj.Type );
        oCmd.Parameters.AddWithValue ( "@strName", oMyObj.Name );
        oCmd.Parameters.AddWithValue ( "@dtModified", oMyObj.Modified );
        oCmd.ExecuteNonQuery (  );
        oCmd.Dispose (  );
    }

    oCmd = new SqliteCommand ( "END", oConn );
    oCmd.ExecuteNonQuery (  );
    oCmd.Dispose (  );

    oConn.Close (  );
    oConn.Dispose (  );
}

尝试将代码更改为以下内容:

using ( var oConn = new SqliteConnection ( "Data Source=" + DB_NAME ) )
{
    oConn.Open (  );

    // Wrap the whole bulk insertion into one block to make it faster, otherwise one transaction per INSERT would be created.
    // Note that this is differen from "BEGIN TRANSACTION" which would increase memory usage a lot!
    SqliteCommand oCmd = new SqliteCommand ( "BEGIN", oConn );
    oCmd.ExecuteNonQuery (  );
    oCmd.Dispose (  );

    oCmd = new SqliteCommand ( "INSERT INTO LocalObjects ( intID, intParentID, intObjectType, strName, dtModified VALUES (@intID, @intParentID, @intObjectType, @strName, @dtModified)", oConn );

    // <do this for all of your parameters>.
    var id = oCmd.CreateParameter();
    id.ParameterName = "@intID";
    oCmd.Parameters.Add(id);
    // </do this for all of your parameters>.

    foreach ( MyObj oObj in aMyObjects )
    {
        // <do this for all of your parameters>.
        id.Value = oMyObj.ID;
        // </do this for all of your parameters>.

        oCmd.ExecuteNonQuery (  );
    }

    oCmd.Dispose();

    oCmd = new SqliteCommand ( "END", oConn );
    oCmd.ExecuteNonQuery (  );
    oCmd.Dispose (  );

    oConn.Close (  );
    oConn.Dispose (  );
}
使用(var-ocann=new-SqliteConnection(“数据源=“+DB_名称))
{
Open();
//将整个批量插入包装到一个块中以加快速度,否则每个插入将创建一个事务。
//请注意,这与“开始事务”不同,后者会大大增加内存使用量!
SqliteCommand oCmd=新的SqliteCommand(“开始”,ocann);
oCmd.ExecuteNonQuery();
Dispose();
oCmd=new SqliteCommand(“插入到本地对象中(intID、intParentID、intObjectType、strName、dtModified值(@intID、@intParentID、@intObjectType、@strName、@dtModified)”,oConn);
// .
var id=oCmd.CreateParameter();
id.ParameterName=“@intID”;
oCmd.Parameters.Add(id);
// .
foreach(对象中的MyObj-oObj)
{
// .
id.值=myObj.id;
// .
oCmd.ExecuteNonQuery();
}
oCmd.Dispose();
oCmd=新的SqliteCommand(“END”,oConn);
oCmd.ExecuteNonQuery();
Dispose();
Close();
Dispose();
}

基本上,现在在每个循环中,您只需更改参数的值,而不是构造一个全新的查询。但是,我不确定您的性能是否真的会从中受益。您需要尝试一下。您还可以尝试使用存储过程插入行。它应该比内联语句更快,尤其是在插入这么多行。

很好的方法。如果将命令包装到事务中,速度会更快。还没有时间尝试它。一旦我测试了它,我将接受你的答案!测试了它。你的版本在37秒内处理我的数据,我的版本需要73秒。谢谢!我唯一关心的是:使用你的解决方案,内存使用率似乎更高n、 知道为什么吗?不,我不知道,对不起。你是怎么得出这个结论的?我从仪器上看到的。它使用了更多的MB。sqlite没有存储过程