Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exposing the transaction used in class Database. #2038

Merged
merged 1 commit into from
Feb 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Dapper.Rainbow/Database.Async.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public Task<IEnumerable<T>> AllAsync() =>
/// <param name="param">The parameters to use.</param>
/// <returns>The number of rows affected.</returns>
public Task<int> ExecuteAsync(string sql, dynamic param = null) =>
_connection.ExecuteAsync(sql, param as object, _transaction, _commandTimeout);
_connection.ExecuteAsync(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Asynchronously queries the current database.
Expand All @@ -98,7 +98,7 @@ public Task<int> ExecuteAsync(string sql, dynamic param = null) =>
/// <param name="param">The parameters to use.</param>
/// <returns>An enumerable of <typeparamref name="T"/> for the rows fetched.</returns>
public Task<IEnumerable<T>> QueryAsync<T>(string sql, dynamic param = null) =>
_connection.QueryAsync<T>(sql, param as object, _transaction, _commandTimeout);
_connection.QueryAsync<T>(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Asynchronously queries the current database for a single record.
Expand All @@ -108,7 +108,7 @@ public Task<IEnumerable<T>> QueryAsync<T>(string sql, dynamic param = null) =>
/// <param name="param">The parameters to use.</param>
/// <returns>An enumerable of <typeparamref name="T"/> for the rows fetched.</returns>
public Task<T> QueryFirstOrDefaultAsync<T>(string sql, dynamic param = null) =>
_connection.QueryFirstOrDefaultAsync<T>(sql, param as object, _transaction, _commandTimeout);
_connection.QueryFirstOrDefaultAsync<T>(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Perform an asynchronous multi-mapping query with 2 input types.
Expand Down Expand Up @@ -195,7 +195,7 @@ public Task<IEnumerable<TReturn>> QueryAsync<TFirst, TSecond, TThird, TFourth, T
/// <param name="param">The parameters to use.</param>
/// <remarks>Note: each row can be accessed via "dynamic", or by casting to an IDictionary&lt;string,object&gt;</remarks>
public Task<IEnumerable<dynamic>> QueryAsync(string sql, dynamic param = null) =>
_connection.QueryAsync(sql, param as object, _transaction);
_connection.QueryAsync(sql, param as object, Transaction);

/// <summary>
/// Execute a command that returns multiple result sets, and access each in turn.
Expand Down
32 changes: 19 additions & 13 deletions Dapper.Rainbow/Database.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,11 @@ public Table(Database<TDatabase> database, string likelyTableName)

private DbConnection _connection;
private int _commandTimeout;
private DbTransaction _transaction;

/// <summary>
/// Get access to the underlying transaction
/// </summary>
public DbTransaction Transaction { get; }

/// <summary>
/// Get underlying database connection.
Expand Down Expand Up @@ -215,27 +219,29 @@ internal virtual Action<TDatabase> CreateTableConstructorForTable()
/// Begins a transaction in this database.
/// </summary>
/// <param name="isolation">The isolation level to use.</param>
public void BeginTransaction(IsolationLevel isolation = IsolationLevel.ReadCommitted)
/// <returns>The transaction created</returns>
public DbTransaction BeginTransaction(IsolationLevel isolation = IsolationLevel.ReadCommitted)
{
_transaction = _connection.BeginTransaction(isolation);
Transaction = _connection.BeginTransaction(isolation);
return Transaction;
}

/// <summary>
/// Commits the current transaction in this database.
/// </summary>
public void CommitTransaction()
{
_transaction.Commit();
_transaction = null;
Transaction.Commit();
Transaction = null;
}

/// <summary>
/// Rolls back the current transaction in this database.
/// </summary>
public void RollbackTransaction()
{
_transaction.Rollback();
_transaction = null;
Transaction.Rollback();
Transaction = null;
}

/// <summary>
Expand Down Expand Up @@ -336,7 +342,7 @@ private bool TableExists(string name)
if (!string.IsNullOrEmpty(schemaName)) builder.Append("TABLE_SCHEMA = @schemaName AND ");
builder.Append("TABLE_NAME = @name");

return _connection.Query(builder.ToString(), new { schemaName, name }, _transaction).Count() == 1;
return _connection.Query(builder.ToString(), new { schemaName, name }, Transaction).Count() == 1;
}

/// <summary>
Expand All @@ -346,7 +352,7 @@ private bool TableExists(string name)
/// <param name="param">The parameters to use.</param>
/// <returns>The number of rows affected.</returns>
public int Execute(string sql, dynamic param = null) =>
_connection.Execute(sql, param as object, _transaction, _commandTimeout);
_connection.Execute(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Queries the current database.
Expand All @@ -357,7 +363,7 @@ public int Execute(string sql, dynamic param = null) =>
/// <param name="buffered">Whether to buffer the results.</param>
/// <returns>An enumerable of <typeparamref name="T"/> for the rows fetched.</returns>
public IEnumerable<T> Query<T>(string sql, dynamic param = null, bool buffered = true) =>
_connection.Query<T>(sql, param as object, _transaction, buffered, _commandTimeout);
_connection.Query<T>(sql, param as object, Transaction, buffered, _commandTimeout);

/// <summary>
/// Queries the current database for a single record.
Expand All @@ -367,7 +373,7 @@ public IEnumerable<T> Query<T>(string sql, dynamic param = null, bool buffered =
/// <param name="param">The parameters to use.</param>
/// <returns>An enumerable of <typeparamref name="T"/> for the rows fetched.</returns>
public T QueryFirstOrDefault<T>(string sql, dynamic param = null) =>
_connection.QueryFirstOrDefault<T>(sql, param as object, _transaction, _commandTimeout);
_connection.QueryFirstOrDefault<T>(sql, param as object, Transaction, _commandTimeout);

/// <summary>
/// Perform a multi-mapping query with 2 input types.
Expand Down Expand Up @@ -455,7 +461,7 @@ public IEnumerable<TReturn> Query<TFirst, TSecond, TThird, TFourth, TFifth, TRet
/// <param name="buffered">Whether the results should be buffered in memory.</param>
/// <remarks>Note: each row can be accessed via "dynamic", or by casting to an IDictionary&lt;string,object&gt;</remarks>
public IEnumerable<dynamic> Query(string sql, dynamic param = null, bool buffered = true) =>
_connection.Query(sql, param as object, _transaction, buffered);
_connection.Query(sql, param as object, Transaction, buffered);

/// <summary>
/// Execute a command that returns multiple result sets, and access each in turn.
Expand All @@ -477,7 +483,7 @@ public virtual void Dispose()
if (connection.State != ConnectionState.Closed)
{
_connection = null;
_transaction = null;
Transaction = null;
connection?.Close();
}
GC.SuppressFinalize(this);
Expand Down