///Execute are the main methods of <see cref="AdoTemplate"/> class. ///All other methods will finally pass through one of ///<see cref="AdoTemplate.Execute{T}(IDataAdapterCallback{T})"/> ///or ///<see cref="AdoTemplate.Execute{T}(IDbCommandCallback{T})"/> methods. /// Direct use of this method is not recommended. /// <summary> ///Execute a ADO.NET operation on a command object using a generic interface based callback. /// </summary> /// <typeparam name="T">return type</typeparam> /// <param name="action">the action to be executed</param> /// <returns></returns> public T Execute <T>(IDbCommandCallback <T> action) { IDbCommand command = null; try { DbProvider.OpenConnection(); command = DbProvider.CreateCommand(); command.Connection = DbProvider.Connection; command.Transaction = DbProvider.Transaction; T result = default(T); result = action.DoInCommand(command); 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.DisposeCommand(command); ConnectionUtils.ClosseConnection(DbProvider); } }