/// <summary>
        /// The execute database data reader.
        /// </summary>
        /// <param name="behavior">The behaviour.</param>
        /// <returns>the resulting <see cref="DbDataReader"/>.</returns>
        protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
        {
            if (_profiler == null || !_profiler.IsActive)
            {
                return(_command.ExecuteReader(behavior));
            }

            DbDataReader result = null;

            _profiler.ExecuteStart(this, SqlExecuteType.Reader);
            try
            {
                result = _command.ExecuteReader(behavior);
                result = new ProfiledDbDataReader(result, _connection, _profiler);
            }
            catch (Exception e)
            {
                _profiler.OnError(this, SqlExecuteType.Reader, e);
                throw;
            }
            finally
            {
                _profiler.ExecuteFinish(this, SqlExecuteType.Reader, result);
            }

            return(result);
        }
Exemple #2
0
        /// <summary>
        /// profile with results.
        /// </summary>
        /// <param name="type">The type of execution.</param>
        /// <param name="func">A function to execute against the profile result.</param>
        /// <typeparam name="TResult">the type of result to return.</typeparam>
        private TResult ProfileWith <TResult>(SqlExecuteType type, Func <TResult> func)
        {
            if (_profiler?.IsActive != true)
            {
                return(func());
            }

            TResult result;

            _profiler.ExecuteStart(this, type);
            try
            {
                result = func();
            }
            catch (Exception e)
            {
                _profiler.OnError(this, type, e);
                throw;
            }
            finally
            {
                _profiler.ExecuteFinish(this, type, null);
            }
            return(result);
        }
            public void OnError(IDbCommand profiledDbCommand, SqlExecuteType executeType, Exception exception)
            {
                var formatter = new SqlServerFormatter();

                exception.Data["SQL"] = formatter.FormatSql(profiledDbCommand.CommandText, SqlTiming.GetCommandParameters(profiledDbCommand));
                _wrapped.OnError(profiledDbCommand, executeType, exception);
            }
Exemple #4
0
        /// <summary>
        /// Adds or updates rows in the <see cref="T:System.Data.DataSet"/> to match those in the data source using the <see cref="T:System.Data.DataSet"/> name, and creates a <see cref="T:System.Data.DataTable"/> named "Table".
        /// </summary>
        /// <param name="dataSet">A <see cref="T:System.Data.DataSet"/> to fill with records and, if necessary, schema.</param>
        /// <returns>
        /// The number of rows successfully added to or refreshed in the <see cref="T:System.Data.DataSet"/>. This does not include rows affected by statements that do not return rows.
        /// </returns>
        public new int Fill(DataSet dataSet)
        {
            /*
             * The SqlDataAdapter type requires that you use a SqlDataCommand for the various adapter commands and will throw an
             * exception if you attempt to pass it a ProfiledDbCommand instead.  This method is a simple wrapper around the existing
             * Fill method and assumes that a single ExecuteReader method will eventually be called on the SelectCommand.  This is
             * somewhat of a hack but appears to be working to give rough timings.
             *
             * While I have not tested this with an oracle DataAdapter, I would guess that it works in much the same way as the
             * SqlDataAdapter type and would thus work fine with this workaround.
             */

            if (_profiler == null || !_profiler.IsActive || !(_selectCommand is DbCommand))
            {
                return(_adapter.Fill(dataSet));
            }

            int result;
            var cmd = (DbCommand)_selectCommand;

            _profiler.ExecuteStart(cmd, ExecuteType.Reader);
            try
            {
                result = _adapter.Fill(dataSet);
            }
            catch (Exception e)
            {
                _profiler.OnError(cmd, ExecuteType.Reader, e);
                throw;
            }
            finally
            {
                _profiler.ExecuteFinish(cmd, ExecuteType.Reader, TokenReader);
            }

            return(result);
        }