/// <summary>
        /// 
        /// </summary>
        /// <param name="contextoAcessoDado"></param>
        /// <param name="comm"></param>
        /// <returns></returns>
        public static DbDataAdapter CriarDataAdapterParaContexto(ContextoAcessoDado contextoAcessoDado, DbCommand comm)
        {
            if (contextoAcessoDado == null)
                throw new NullReferenceException("Nao existe uma escopo para a criacao do DbDataAdapter");
            DbDataAdapter dataAdapter;
            dataAdapter = contextoAcessoDado.ProviderFactory.CreateDataAdapter();
            dataAdapter.SelectCommand = comm;

            return dataAdapter;
        }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="contextoAcessoDado"></param>
 /// <param name="commandText"></param>
 /// <param name="commandType"></param>
 /// <param name="commandTimeout"></param>
 /// <returns></returns>
 public static DbCommand CriarCommandParaContexto(ContextoAcessoDado contextoAcessoDado, string commandText, CommandType commandType, int commandTimeout)
 {
     if (contextoAcessoDado == null)
         throw new NullReferenceException("Nao existe um escopo para a criacao do DbCommand");
     DbCommand command = contextoAcessoDado.ProviderFactory.CreateCommand();
     command.Connection = contextoAcessoDado.Connection;
     command.CommandText = commandText;
     command.CommandType = commandType;
     command.CommandTimeout = commandTimeout;
     if (contextoAcessoDado.Transaction != null)
     {
         command.Transaction = contextoAcessoDado.Transaction;
     }
     return command;
 }
 public DbCommand ObterCommand(ContextoAcessoDado contextoAcessoDado)
 {
     ChecarDisposed();
     if (_Command == null)
     {
         _Command = BdUtil.CriarCommandParaContexto(contextoAcessoDado, _CommandText, _CommandType, _CommandTimeout);
     }
     return _Command;
 }
        private void InicializarEscopo(OpcaoEscopo opcaoEscopo, string nomeConfigConexao, OpcaoTransacao opcaoTransacao)
        {
            // nos precisamos mudar _Atual?
            bool precisaMudarEscopo;
            VerificarMudancaEscopo(opcaoEscopo, nomeConfigConexao, out precisaMudarEscopo);

            //this.InicializarEscopo(opcaoEscopo, );
            if (precisaMudarEscopo)
            {
                // Inicializando apenas se um novo escopo vai ser criado
                _ContextoAcessoDado = new ContextoAcessoDado(nomeConfigConexao);
                _ContextoAutenticacao = new ContextoAutenticacao();
                AtribuirEscopoAtual();
                // Uma transacao nunca é iniciada em um escopo que nao inciou transacional
                ConfigurarTransacao(opcaoTransacao);
            }
        }
        private void InicializarEscopo(ContextoAcessoDado acessoDado)
        {
            bool precisaMudarEscopo;
            VerificarMudancaEscopo(OpcaoEscopo.RequerNovo, String.Empty, out precisaMudarEscopo);

            if (precisaMudarEscopo)
            {
                // Inicializando apenas se um novo escopo vai ser criado
                _ContextoAcessoDado = acessoDado;
                AtribuirEscopoAtual();
            }
        }
 /// <summary>
 /// Faz Commit na transacao se for necessario e chama <see cref="Acontep.Dado.ContextoAcessoDado.Dispose"/>
 /// </summary>
 /// <param name="contextoAcessoDado">Valor a sofrer o processo de finalizacao</param>
 /// <param name="marcadoComoCompleto"></param>
 private void FinalizarContextoAcessoDado(ContextoAcessoDado contextoAcessoDado, bool marcadoComoCompleto)
 {
     if (contextoAcessoDado != null)
     {
         try
         {
             // Se o escopo foi marcado como terminado entao faz um commit na transacao
             if (marcadoComoCompleto && contextoAcessoDado.Transaction != null)
                 contextoAcessoDado.Transaction.Commit();
         }
         finally
         {
             contextoAcessoDado.Dispose();
         }
     }
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="disposing"></param>
 protected override void Dispose(bool disposing)
 {
     bool possoFinalizar = !EstaFinalizado && disposing && --(Atual.ContadorEscopo) < 1;
     if (possoFinalizar)
     {
         bool marcadoComoCompleto = MarcadoComoCompleto;
         // Primeiro, remover esta instancia da fila (mas, apenas se nos somos o atual da fila e se nosso
         // contador de escopos indicar que somos o primeiro criado)
         //  Nota: Thread-local _Atual, e requerimento de que o escopo nao sofra dispose em outras threads
         //      significam que podemos dispensar o lock.
         if (_Atual == this)
         {
             // Caso o usuario tenha chamado dispose fora de ordem, retorna na fila
             // ate encontrar objetos que nao tenham sido finalizados (chamada a dispose).
             Escopo anterior = _EscopoAnterior;
             while (anterior != null && anterior.EstaFinalizado)
             {
                 anterior = anterior._EscopoAnterior;
             }
             _Atual = anterior;
         }
         // segundo, marcar nosso estado interno como finalizado
         ContextoAcessoDado contextoAcessoDado = _ContextoAcessoDado;
         _ContextoAcessoDado = null;
         // Por ultimo, limpar os escopos de dados mantidos por mim
         FinalizarContextoAcessoDado(contextoAcessoDado, marcadoComoCompleto);
     }
     base.Dispose(disposing);
 }
 /// <summary>
 /// Inicia um novo escopo de execução com <paramref name="acessoDado"/>
 /// </summary>
 /// <param name="acessoDado">Inicia um escopo com este contexto de acesso a dado</param>
 public Escopo(ContextoAcessoDado acessoDado)
 {
     InicializarEscopo(acessoDado);
 }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="contextoAcessoDado"></param>
        /// <param name="commandWrappers"></param>
        /// <returns></returns>
        internal static DbDataAdapter CriarDataAdapterDeCommandWrappers(ContextoAcessoDado contextoAcessoDado, Dictionary<TipoCommandDataAdapter, CommandWrapper> commandWrappers)
        {
            if (contextoAcessoDado == null)
                throw new NullReferenceException("Nao existe uma escopo para a criacao do DbDataAdapter");
            DbCommand selectCommand = ObterCommand(contextoAcessoDado, TipoCommandDataAdapter.Select, commandWrappers);
            if (selectCommand == null)
                throw new NullReferenceException("A lista de CommandWrappers deve conter no minimo um command de select para que um DbDataAdapter seja criado");
            DbDataAdapter dataAdapter;
            dataAdapter = contextoAcessoDado.ProviderFactory.CreateDataAdapter();
            dataAdapter.SelectCommand = selectCommand;
            dataAdapter.InsertCommand = ObterCommand(contextoAcessoDado, TipoCommandDataAdapter.Insert, commandWrappers);
            dataAdapter.UpdateCommand = ObterCommand(contextoAcessoDado, TipoCommandDataAdapter.Update, commandWrappers);
            dataAdapter.DeleteCommand = ObterCommand(contextoAcessoDado, TipoCommandDataAdapter.Delete, commandWrappers);

            return dataAdapter;
        }
 /// <summary>
 /// Extrair <see cref="DbCommand"/> de uma lista de <see cref="CommandWrapper"/>s através do <see cref="TipoCommandDataAdapter"/>
 /// </summary>
 /// <param name="contextoAcessoDado"></param>
 /// <param name="tipoCommandDataAdapter"></param>
 /// <param name="commandWrappersDataAdapter"></param>
 /// <returns></returns>
 internal static DbCommand ObterCommand(ContextoAcessoDado contextoAcessoDado, TipoCommandDataAdapter tipoCommandDataAdapter, Dictionary<TipoCommandDataAdapter, CommandWrapper> commandWrappersDataAdapter)
 {
     if (commandWrappersDataAdapter.ContainsKey(tipoCommandDataAdapter))
     {
         CommandWrapper commandWrapper = commandWrappersDataAdapter[tipoCommandDataAdapter];
         return commandWrapper.ObterCommand(contextoAcessoDado);
     }
     else
     {
         return null;
     }
 }