Wie kann ich recycle meine SqliteCommand zu beschleunigen Sqlite bulk insert (iOS)?

Bin ich mit dem code unten, um bulk insert a 30000 Zeilen (1000 Zeilen gleichzeitig). Noch ist es nicht so schnell, wie es sein könnte. In diesem Beispiel Verbesserung der EINSATZ-pro-Sekunde-Leistung von SQLite? ich kann sehen, dass Sie die Erstellung der SqliteCommand nur einmal und dann reycle es sein, rücksetzen und löschen der Bindungen. Aber ich kann nicht finden die entsprechenden Methoden auf iOS/Monotouch. Es gibt keine Reset() oder ClearBindings() oder irgendetwas anderes suchen ähnliche.

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 (  );
}
InformationsquelleAutor Krumelur | 2011-03-15
Schreibe einen Kommentar