using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Text; using System.Threading.Tasks; namespace Benchmarks { public class RawDb { private readonly ConcurrentRandom _random; private readonly DbProviderFactory _dbProviderFactory; private readonly string _connectionString; public RawDb(ConcurrentRandom random, DbProviderFactory dbProviderFactory) { _random = random; _dbProviderFactory = dbProviderFactory; _connectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=3"; } public async Task LoadSingleQueryRow() { using (var db = _dbProviderFactory.CreateConnection()) { db.ConnectionString = _connectionString; await db.OpenAsync(); using (var cmd = CreateReadCommand(db)) { return await ReadSingleRow(db, cmd); } } } async Task ReadSingleRow(DbConnection connection, DbCommand cmd) { using (var rdr = await cmd.ExecuteReaderAsync(CommandBehavior.SingleRow)) { await rdr.ReadAsync(); return new World { Id = rdr.GetInt32(0), RandomNumber = rdr.GetInt32(1) }; } } DbCommand CreateReadCommand(DbConnection connection) { var cmd = connection.CreateCommand(); cmd.CommandText = "SELECT id, randomnumber FROM world WHERE id = @Id"; var id = cmd.CreateParameter(); id.ParameterName = "@Id"; id.DbType = DbType.Int32; id.Value = _random.Next(1, 10001); cmd.Parameters.Add(id); return cmd; } public async Task LoadMultipleQueriesRows(int count) { using (var db = _dbProviderFactory.CreateConnection()) { db.ConnectionString = _connectionString; await db.OpenAsync(); return await LoadMultipleRows(count, db); } } private async Task LoadMultipleRows(int count, DbConnection db) { using (var cmd = CreateReadCommand(db)) { cmd.Parameters["@Id"].Value = _random.Next(1, 10001); var result = new World[count]; for (int i = 0; i < result.Length; i++) { result[i] = await ReadSingleRow(db, cmd); cmd.Parameters["@Id"].Value = _random.Next(1, 10001); } return result; } } public async Task> LoadFortunesRows() { var result = new List(); using (var db = _dbProviderFactory.CreateConnection()) using (var cmd = db.CreateCommand()) { cmd.CommandText = "SELECT id, message FROM fortune"; db.ConnectionString = _connectionString; await db.OpenAsync(); using (var rdr = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection)) { while (await rdr.ReadAsync()) { result.Add(new Fortune { Id = rdr.GetInt32(0), Message = rdr.GetString(1) }); } } } result.Add(new Fortune { Message = "Additional fortune added at request time." }); result.Sort(); return result; } } }