/// <summary> /// Creates/Rollbacks/Disposes Transaction /// </summary> /// <param name="body">Use Transaction.</param> /// <param name="this">Desired connection source.</param> /// <param name="token">Cancellation Token.</param> private static void Transaction(this IConnectionSource @this, Action <Transaction> body, CancellationToken token) { @this.Transaction(tran => { body(tran); return(0); }, token); }
/// <summary> /// Creates/Rollbacks/Disposes Transaction /// </summary> /// <param name="body">Use Transaction.</param> /// <param name="this">Desired connection source.</param> /// <param name="token">Cancellation Token.</param> /// <typeparam name="T">Generic Type T.</typeparam> /// <returns>Query Results of Type T.</returns> private static T Transaction <T>(this IConnectionSource @this, Func <Transaction, T> body, CancellationToken token) { if (body.Method.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) != null) { throw new InvalidOperationException("Async Lambdas not supported, please use a Pool."); } var transaction = @this as ManagedTransaction; var ts = @this as IPool; var tran = transaction ?? @this?.Transaction() ?? new Transaction(ContextController.DefaultContext) { Token = token }; // ReSharper disable once ConditionIsAlwaysTrueOrFalse var handleTransaction = transaction == null && ts == null && @this == null; var conn = tran.Connection; if (conn.State == ConnectionState.Closed) { conn.Open(); } tran.OnTransactionCreated(tran); if (tran.DbTransaction == null) { tran.DbTransaction = conn.BeginTransaction(); } try { var res = body(tran); if (handleTransaction) { tran.Commit(); } return(res); } catch (Exception) { if (handleTransaction) { tran.Rollback(); } throw; } finally { if (handleTransaction) { tran.Dispose(); conn.Close(); conn.Dispose(); } } }
/// <summary> /// Creates/Rollbacks/Disposes Transaction /// </summary> /// <param name="body">Use Transaction.</param> /// <param name="this">Desired connection source.</param> /// <param name="token">Cancellation Token.</param> /// <returns>Awaitable Task</returns> public static Task TransactionAsync(this IConnectionSource @this, Action <Transaction> body, CancellationToken token) { return(Task.Run(() => @this.Transaction(body, token), token)); }
/// <summary> /// Creates/Rollbacks/Disposes Transaction /// </summary> /// <param name="body">Use Transaction.</param> /// <param name="this">Desired connection source.</param> // ReSharper disable once MemberCanBePrivate.Global public static void Transaction(this IConnectionSource @this, Action <Transaction> body) { @this.Transaction(body, CancellationToken.None); }
/// <summary> /// Creates/Rollbacks/Disposes Transaction /// </summary> /// <param name="body">Use Transaction.</param> /// <param name="this">Desired connection source.</param> /// <typeparam name="T">Generic Type T.</typeparam> /// <returns>Query Results of Type T.</returns> // ReSharper disable once MemberCanBePrivate.Global public static T Transaction <T>(this IConnectionSource @this, Func <Transaction, T> body) { return(@this.Transaction(body, CancellationToken.None)); }
// ReSharper disable once MemberCanBePrivate.Global /// <summary> /// Executes SqlCommand and returns Result. /// </summary> /// <param name="this">Desired IConnectionSource.</param> /// <returns>Database Query Result of Type T.</returns> public static ICommand Query(this IConnectionSource @this) { return(@this.Transaction(tran => new Command("", tran))); }
// ReSharper disable once MemberCanBePrivate.Global /// <summary> /// Executes SqlCommand and returns Result. /// </summary> /// <param name="this">Desired IConnectionSource.</param> /// <param name="database">Name of the database.</param> /// <returns>Database Query Result of Type T.</returns> public static ICommand Query(this IConnectionSource @this, string database) { return(@this.Transaction(database).Query()); }