/// <summary>
        /// ExecuteInsert
        /// </summary>
        /// <param name="pInformacaoTransacao"></param>
        /// <param name="pSqlConnection"></param>
        /// <returns></returns>
        internal ResultadoTransacao ExecuteInsert(InformacaoTransacao pInformacaoTransacao, SqlConnection pSqlConnection)
        {
            ResultadoTransacao resultadoTransacao = new ResultadoTransacao("Insert");
            SqlCommand         sqlCommand         = pInformacaoTransacao.ObterSqlCommand();

            sqlCommand.Connection = pSqlConnection;
            resultadoTransacao.MarcarRegistrosAfetados(sqlCommand.ExecuteNonQuery());

            return(resultadoTransacao);
        }
        /// <summary>
        /// ExecuteSelect
        /// </summary>
        /// <param name="pInformacaoTransacao"></param>
        /// <param name="pSqlConnection"></param>
        /// <returns></returns>
        internal ResultadoTransacao ExecuteSelect(InformacaoTransacao pInformacaoTransacao, SqlConnection pSqlConnection)
        {
            ResultadoTransacao resultadoTransacao = new ResultadoTransacao("Select");
            SqlCommand         sqlCommand         = pInformacaoTransacao.ObterSqlCommand();

            this.sqlDataAdapter = new SqlDataAdapter(sqlCommand);
            DataSet dataSet = new DataSet();

            sqlCommand.Connection             = pSqlConnection;
            sqlCommand.CommandTimeout         = 3000;
            this.sqlDataAdapter.SelectCommand = sqlCommand;

            resultadoTransacao.MarcarRegistrosAfetados(this.sqlDataAdapter.Fill(dataSet));
            resultadoTransacao.MarcarDataSet(dataSet);
            resultadoTransacao.MarcarParametrosSaida(pInformacaoTransacao.ObterParametrosSaida(this.sqlDataAdapter.SelectCommand));

            return(resultadoTransacao);
        }
        /// <summary>
        /// ExecuteProcedure
        /// </summary>
        /// <param name="pInformacaoTransacao"></param>
        /// <param name="pSqlConnection"></param>
        /// <returns></returns>
        internal ResultadoTransacao ExecuteProcedure(InformacaoTransacao pInformacaoTransacao, SqlConnection pSqlConnection, SqlTransaction pSqlTransaction)
        {
            ResultadoTransacao resultadoTransacao = new ResultadoTransacao("Procedure");
            SqlCommand         sqlCommand         = pInformacaoTransacao.ObterSqlCommand();

            sqlCommand.Transaction = pSqlTransaction;
            this.sqlDataAdapter    = new SqlDataAdapter(sqlCommand);
            DataSet dataSet = new DataSet();

            sqlCommand.Connection     = pSqlConnection;
            sqlCommand.CommandTimeout = 3000;
            //
            int registrosAfetados = sqlCommand.ExecuteNonQuery();

            //
            resultadoTransacao.MarcarRegistrosAfetados(registrosAfetados);
            resultadoTransacao.MarcarParametrosSaida(pInformacaoTransacao.ObterParametrosSaida(sqlCommand));
            //
            return(resultadoTransacao);
        }
        /// <summary>
        /// Verifica e executa o instrução SQL
        /// </summary>
        /// <param name="pInformacaoTransacao"></param>
        /// <returns></returns>
        private ResultadoTransacao ExecutarSQL(InformacaoTransacao pInformacaoTransacao)
        {
            try
            {
                switch (pInformacaoTransacao.TipoTransacao)
                {
                case TipoTransacao.Select:
                    this._resultadoTransacao = this._executor.ExecuteSelect(pInformacaoTransacao, FabricaConexao.ObterInstancia().ObterConexao());
                    break;

                case TipoTransacao.Update:
                    this._resultadoTransacao = this._executor.ExecuteUpdate(pInformacaoTransacao, FabricaConexao.ObterInstancia().ObterConexao());
                    break;

                case TipoTransacao.Insert:
                    this._resultadoTransacao = this._executor.ExecuteInsert(pInformacaoTransacao, FabricaConexao.ObterInstancia().ObterConexao());
                    break;

                case TipoTransacao.Delete:
                    this._resultadoTransacao = this._executor.ExecuteDelete(pInformacaoTransacao, FabricaConexao.ObterInstancia().ObterConexao());
                    break;

                case TipoTransacao.Procedure:
                    this._resultadoTransacao = this._executor.ExecuteProcedure(pInformacaoTransacao, FabricaConexao.ObterInstancia().ObterConexao());
                    break;

                default:
                    throw new Exception("Tipo de transação Inválida!");
                }

                return(this._resultadoTransacao);
            }
            catch (SqlException)
            {
                throw;
            }
            catch (System.Exception)
            {
                throw;
            }
        }
        /// <summary>
        /// Executar
        /// </summary>
        /// <param name="pInformacaoTransacao"></param>
        /// <returns></returns>
        public ResultadoTransacao Executar(InformacaoTransacao pInformacaoTransacao)
        {
            try
            {
                FabricaConexao.ObterInstancia().ObterConexao().Open();
                //
                switch (pInformacaoTransacao.TipoTransacao)
                {
                case TipoTransacao.Select:
                case TipoTransacao.Update:
                case TipoTransacao.Insert:
                case TipoTransacao.Delete:
                case TipoTransacao.Procedure:
                    this._resultadoTransacao = this.ExecutarSQL(pInformacaoTransacao);
                    break;

                default:
                    throw new Exception("Tipo de transação Inválido!");
                }
                return(_resultadoTransacao);
            }
            catch (SqlException ex)
            {
                if (ex.Number == 2601 || ex.Number == 2627)
                {
                    this._resultadoTransacao.MarcarExcecao(ex);
                    this._resultadoTransacao.MarcarResultado(Utilitarios.Enumeradores.Resultados.Duplicado);
                    return(this._resultadoTransacao);
                }
                else if (ex.Number == 547)
                {
                    this._resultadoTransacao.MarcarResultado(Utilitarios.Enumeradores.Resultados.FKConstraint);
                    this._resultadoTransacao.MarcarExcecao(ex);
                    return(this._resultadoTransacao);
                }
                else if (ex.Number == -1)
                {
                    this._resultadoTransacao.MarcarResultado(Utilitarios.Enumeradores.Resultados.SemConexao);
                    this._resultadoTransacao.MarcarExcecao(ex);
                    return(this._resultadoTransacao);
                }
                else
                {
                    this._resultadoTransacao.MarcarResultado(Utilitarios.Enumeradores.Resultados.Erro);
                    this._resultadoTransacao.MarcarExcecao(ex);

                    return(this._resultadoTransacao);
                }
            }
            catch (System.Exception ex)
            {
                this._resultadoTransacao.MarcarResultado(Utilitarios.Enumeradores.Resultados.Erro);
                this._resultadoTransacao.MarcarExcecao(ex);

                return(this._resultadoTransacao);
            }
            finally
            {
                FabricaConexao.ObterInstancia().ObterConexao().Close();
            }
        }