using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Dapper { public abstract partial class Database : IDisposable where TDatabase : Database, new() { public partial class Table { /// /// Insert a row into the db asynchronously /// /// Either DynamicParameters or an anonymous type or concrete type /// public virtual async Task InsertAsync(dynamic data) { var o = (object)data; List paramNames = GetParamNames(o); paramNames.Remove("Id"); string cols = string.Join(",", paramNames); string cols_params = string.Join(",", paramNames.Select(p => "@" + p)); var sql = "set nocount on insert " + TableName + " (" + cols + ") values (" + cols_params + ") select cast(scope_identity() as int)"; return (await database.QueryAsync(sql, o).ConfigureAwait(false)).Single(); } /// /// Update a record in the DB asynchronously /// /// /// /// public Task UpdateAsync(TId id, dynamic data) { List paramNames = GetParamNames((object)data); var builder = new StringBuilder(); builder.Append("update ").Append(TableName).Append(" set "); builder.AppendLine(string.Join(",", paramNames.Where(n => n != "Id").Select(p => p + "= @" + p))); builder.Append("where Id = @Id"); DynamicParameters parameters = new DynamicParameters(data); parameters.Add("Id", id); return database.ExecuteAsync(builder.ToString(), parameters); } /// /// Delete a record for the DB asynchronously /// /// /// public async Task DeleteAsync(TId id) { return (await database.ExecuteAsync("delete from " + TableName + " where Id = @id", new { id }).ConfigureAwait(false)) > 0; } /// /// Grab a record with a particular Id from the DB asynchronously /// /// /// public async Task GetAsync(TId id) { return (await database.QueryAsync("select * from " + TableName + " where Id = @id", new { id }).ConfigureAwait(false)).FirstOrDefault(); } public virtual async Task FirstAsync() { return (await database.QueryAsync("select top 1 * from " + TableName).ConfigureAwait(false)).FirstOrDefault(); } public Task> AllAsync() { return database.QueryAsync("select * from " + TableName); } } public Task ExecuteAsync(string sql, dynamic param = null) { return connection.ExecuteAsync(sql, param as object, transaction, this.commandTimeout); } public Task> QueryAsync(string sql, dynamic param = null) { return connection.QueryAsync(sql, param as object, transaction, commandTimeout); } public Task> QueryAsync(string sql, Func map, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null) { return connection.QueryAsync(sql, map, param as object, transaction, buffered, splitOn); } public Task> QueryAsync(string sql, Func map, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null) { return connection.QueryAsync(sql, map, param as object, transaction, buffered, splitOn); } public Task> QueryAsync(string sql, Func map, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null) { return connection.QueryAsync(sql, map, param as object, transaction, buffered, splitOn); } public Task> QueryAsync(string sql, Func map, dynamic param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null) { return connection.QueryAsync(sql, map, param as object, transaction, buffered, splitOn); } public Task> QueryAsync(string sql, dynamic param = null) { return connection.QueryAsync(sql, param as object, transaction); } public Task QueryMultipleAsync(string sql, dynamic param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) { return SqlMapper.QueryMultipleAsync(connection, sql, param, transaction, commandTimeout, commandType); } } }