/// <summary> /// Execute a ADO.NET operation on a command object using a generic interface based callback. /// Direct use of this method is not recommended. /// </summary> /// <typeparam name="T">return type</typeparam> /// <param name="action">the action to be executed</param> public T Execute <T>(IDataAdapterCallback <T> action) { IDbDataAdapter dataAdapter = null; try { DbProvider.OpenConnection(); dataAdapter = DbProvider.CreateDataAddapter(); dataAdapter.SelectCommand = DbProvider.CreateCommand(); dataAdapter.SelectCommand.Connection = DbProvider.Connection; dataAdapter.SelectCommand.Transaction = DbProvider.Transaction; T result = default(T); result = action.DoInDataAdapter(dataAdapter); return(result); } catch (DataException) { throw; } catch (DbException e) { throw new DataException($"Failed to execute a command cllback: {e.Message}", e); } catch (Exception) { throw; } finally { ConnectionUtils.DisposeDataAdapterCommands(dataAdapter); ConnectionUtils.ClosseConnection(DbProvider); } }