void Main() { var dbs = new[] { new { Provider = "System.Data.OleDb", ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=E:\tmp\testdb\access.mdb" }, new { Provider = "System.Data.SqlServerCe.3.5", ConnectionString = @"Data Source=E:\tmp\testdb\sqlce35.sdf" }, new { Provider = "System.Data.SqlServerCe.4.0", ConnectionString = @"Data Source=E:\tmp\testdb\sqlce40.sdf" }, new { Provider = "System.Data.SQLite", ConnectionString = @"Data Source=E:\tmp\testdb\test.db" } }; foreach (var db in dbs) { var factory = DbProviderFactories.GetFactory(db.Provider); using (var connection = factory.CreateConnection()) { connection.ConnectionString = db.ConnectionString; connection.Open(); CreateSchema(connection); lastId = 0; // First run for JIT warmup TestInsert(connection, 1, true); Stopwatch sw = Stopwatch.StartNew(); TestInsert(connection, 100000, true); sw.Stop(); Console.WriteLine ("{0} (with transaction) - {1}", db.Provider, sw.Elapsed); sw.Reset(); sw.Start(); TestInsert(connection, 100000, false); sw.Stop(); Console.WriteLine ("{0} (no transaction) - {1}", db.Provider, sw.Elapsed); } } } void CreateSchema(DbConnection connection) { try { using (var dropCommand = connection.CreateCommand()) { dropCommand.CommandText = "DROP TABLE Product"; dropCommand.ExecuteNonQuery(); } } catch { } using (var createTableCommand = connection.CreateCommand()) { createTableCommand.CommandText = "CREATE TABLE Product (Id INTEGER NOT NULL PRIMARY KEY, Name NVARCHAR(200) NOT NULL)"; createTableCommand.ExecuteNonQuery(); } } int lastId = 0; void TestInsert(DbConnection connection, int count, bool useTransaction) { DbTransaction transaction = null; if (useTransaction) transaction = connection.BeginTransaction(); using (transaction) { using (var command = connection.CreateCommand()) { command.CommandText = "INSERT INTO Product(Id, Name) VALUES (@id, @name)"; var idParameter = command.CreateParameter(); idParameter.ParameterName = "id"; idParameter.DbType = DbType.Int32; command.Parameters.Add(idParameter); var nameParameter = command.CreateParameter(); nameParameter.ParameterName = "name"; nameParameter.DbType = DbType.String; nameParameter.Value = "blabla"; command.Parameters.Add(nameParameter); command.Transaction = transaction; for (int i = 0; i < count; i++) { idParameter.Value = ++lastId; command.ExecuteNonQuery(); } } if (transaction != null) transaction.Commit(); } }