/// <summary>
        /// Carrega os campos do objeto alvo
        /// </summary>
        /// <param name="nomeObjeto">nome do objeto</param>
        /// <param name="tipo">tipo do objeto (tabela,view,procedure)</param>
        private void CarregaCamposObjeto(string nomeObjeto, TipoObjetoBanco.ETipoObjeto tipo)
        {
            try
            {
                if (ObjetosSelecionado.Key == null)
                {
                    var colunasObjeto = new List<DadosColunas>();

                    switch (tipo)
                    {
                        case TipoObjetoBanco.ETipoObjeto.Tabela:
                            colunasObjeto = Gerador.MapeamentoTabela.ListAllFieldsFromTable(BancoSelecionado, nomeObjeto, DadosLogin);
                            break;

                        case TipoObjetoBanco.ETipoObjeto.View:
                            colunasObjeto = Gerador.MapeamentoView.ListAllFieldsFromViews(BancoSelecionado, nomeObjeto, DadosLogin);
                            break;

                        case TipoObjetoBanco.ETipoObjeto.Procedure:
                            Parametros = Gerador.MapeamentoProcedure.ListaAllStoredProceduresParameters(BancoSelecionado, DadosLogin, nomeObjeto);

                            if (Parametros.Count > 0)
                            {
                                var frm = new frmParametros { Parametros = Parametros };

                                if (frm.ShowDialog(this) == DialogResult.Yes)
                                {
                                    Parametros = frm.Parametros;
                                }
                                frm.Dispose();
                            }

                            if (MessageBox.Show(string.Format("Algumas procedures podem desencadear uma sequencia de insert's, update's e delete's.\nExecute apenas procedures que você conheça o funcionamento e que retornem dados.\nDeseja executar a procedure '{0}' ?", nomeObjeto), "ATENÇÃO", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                            {
                                colunasObjeto = Gerador.MapeamentoProcedure.ListAllFieldsFromStoredProcedure(BancoSelecionado, nomeObjeto, Parametros, DadosLogin);
                            }

                            break;

                        case TipoObjetoBanco.ETipoObjeto.Query:
                            colunasObjeto = Colunas;
                            break;

                        default:
                            throw new ArgumentOutOfRangeException("tipo", "Tipo inválido");
                    }

                    ObjetosSelecionado = tipo == TipoObjetoBanco.ETipoObjeto.Query ?
                        new KeyValuePair<TipoObjetoBanco, List<DadosColunas>>(new TipoObjetoBanco(nomeObjeto, tipo.ToString(), Parametros, Consulta), colunasObjeto)
                        : new KeyValuePair<TipoObjetoBanco, List<DadosColunas>>(new TipoObjetoBanco(nomeObjeto, tipo.ToString(), Parametros), colunasObjeto);

                }

                GridView.CarregaGridViewColunas(gvColunasObjeto, ObjetosSelecionado, IlObjetos);
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("Erro:\n{0}", ex.Message), ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private static void GeraClassesORM(TipoObjetoBanco objOrm, List<DadosColunas> colunasObjeto, ParametrosCriarProjetos parametros)
        {
            var gerador = new Gerador { Log = Log };
            var nomeArquivo = Gerador.RetornaNomeClasseAjustado(objOrm.NomeObjeto);

            var arquivo = gerador.GerarClasseTO(colunasObjeto, objOrm.NomeObjeto, parametros.NameSpace, objOrm.Associacoes, objOrm.Enumns, parametros);
            var arquivoBLL = gerador.GerarClasseBLL(nomeArquivo, parametros.NameSpace, objOrm.TipoObjeto, objOrm.Parametros);
            var arquivoDAL = gerador.GerarClasseDAL(nomeArquivo, parametros.NameSpace, objOrm.TipoObjeto, objOrm.Parametros, objOrm.QuerySql);

            File.WriteAllText(string.Format("{0}\\TO\\{1}TO.cs", parametros.CaminhoDestino, nomeArquivo), arquivo);
            File.WriteAllText(string.Format("{0}\\BLL\\{1}BLL.cs", parametros.CaminhoDestino, nomeArquivo), arquivoBLL);
            File.WriteAllText(string.Format("{0}\\DAL\\{1}DAL.cs", parametros.CaminhoDestino, nomeArquivo), arquivoDAL);
        }
        public string GerarClasseDAL(string nomeTabela, string strNamespace, TipoObjetoBanco.ETipoObjeto tipoObjeto, List<DadosStoredProceduresParameters> parametros, string query)
        {

            string textoBase;
            switch (tipoObjeto)
            {
                case TipoObjetoBanco.ETipoObjeto.Tabela:
                    textoBase = RetornaTextoBase("padraoDALNativo");
                    break;
                case TipoObjetoBanco.ETipoObjeto.Query:
                case TipoObjetoBanco.ETipoObjeto.Procedure:
                    textoBase = RetornaTextoBase("padraoDALProc");
                    textoBase = textoBase.Replace("{parametros}", string.Join(", ", parametros.Select(p => string.Format("{0} {1}", p.ParameterDotNetType, p.ParameterName))));

                    var sbParametros = new StringBuilder();

                    foreach (var parametro in parametros)
                    {
                        sbParametros.AppendLine(string.Format("cmd.Parameters.AddWithValue(\"{0}\", {0});", parametro.ParameterName));
                    }

                    textoBase = textoBase.Replace("{carregaParametros}", sbParametros.ToString());
                    textoBase = textoBase.Replace("{query}", tipoObjeto == TipoObjetoBanco.ETipoObjeto.Procedure ? nomeTabela : query);
                    textoBase = textoBase.Replace("{proc}", tipoObjeto == TipoObjetoBanco.ETipoObjeto.Procedure ? "cmd.CommandType = CommandType.StoredProcedure;" : "");

                    break;
                case TipoObjetoBanco.ETipoObjeto.View:
                    textoBase = RetornaTextoBase("padraoDALNativo");
                    textoBase = Regex.Replace(textoBase, "#region .: Persistencia :.(.|\n)*?#endregion", string.Empty);
                    break;
                default:
                    throw new ArgumentOutOfRangeException("tipoObjeto");
            }
            textoBase = Log ? textoBase.Replace("[log]", "Log.Error(ex.Message, ex);").Replace("[logHeader]", string.Format("private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof({0}DAL));", nomeTabela)) : textoBase.Replace("[log]", "").Replace("[logHeader]", "");

            return textoBase.Replace("{namespace}", strNamespace).Replace("{classe}", (nomeTabela));

        }
        public string GerarClasseBLL(string nomeTabela, string strNamespace, TipoObjetoBanco.ETipoObjeto tipoObjeto, List<DadosStoredProceduresParameters> parametros)
        {

            string textoBase;
            switch (tipoObjeto)
            {
                case TipoObjetoBanco.ETipoObjeto.Tabela:
                    textoBase = RetornaTextoBase("padraoBLLNativo");
                    break;
                case TipoObjetoBanco.ETipoObjeto.Query:
                case TipoObjetoBanco.ETipoObjeto.Procedure:
                    textoBase = RetornaTextoBase("padraoBLLProc");
                    textoBase = textoBase.Replace("{parametros}", string.Join(", ", parametros.Select(p => string.Format("{0} {1}", p.ParameterDotNetType, p.ParameterName))));
                    textoBase = textoBase.Replace("{parametros2}", string.Join(", ", parametros.Select(p => p.ParameterName)));
                    break;
                case TipoObjetoBanco.ETipoObjeto.View:
                    textoBase = RetornaTextoBase("padraoBLLNativo");
                    textoBase = Regex.Replace(textoBase, "#region .: CRUD :.(.|\n)*?#endregion", string.Empty);
                    break;
                default:
                    throw new ArgumentOutOfRangeException("tipoObjeto");
            }
            textoBase = Log ? textoBase.Replace("[log]", "Log.Error(ex.Message, ex);").Replace("[logHeader]", string.Format("private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(typeof({0}BLL));", nomeTabela)) : textoBase.Replace("[log]", "").Replace("[logHeader]", "");

            return textoBase.Replace("{namespace}", strNamespace).Replace("{classe}", (nomeTabela));

        }
        /// <summary>
        /// Carrega os campos do objeto alvo
        /// </summary>
        /// <param name="nomeObjeto">nome do objeto</param>
        /// <param name="tipo">tipo do objeto (tabela,view,procedure)</param>
        /// <param name="retornaDados">REtorna a lista de campos obtidas</param>
        private List<DadosColunas> CarregaCamposObjeto(string nomeObjeto, TipoObjetoBanco.ETipoObjeto tipo, bool retornaDados = false)
        {
            try
            {
                var colunasObjeto = new List<DadosColunas>();

                switch (tipo)
                {
                    case TipoObjetoBanco.ETipoObjeto.Tabela:
                        colunasObjeto = Gerador.MapeamentoTabela.ListAllFieldsFromTable(BancoSelecionado, nomeObjeto, DadosLogin);
                        break;

                    case TipoObjetoBanco.ETipoObjeto.View:
                        colunasObjeto = Gerador.MapeamentoView.ListAllFieldsFromViews(BancoSelecionado, nomeObjeto, DadosLogin);
                        break;

                    case TipoObjetoBanco.ETipoObjeto.Procedure:
                        if (MessageBox.Show(string.Format("Algumas procedures podem desencadear uma sequencia de insert's, update's e delete's.\nExecute apenas procedures que você conheça o funcionamento e que retornem dados.\nDeseja executar a procedure '{0}' ?", nomeObjeto), "ATENÇÃO", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                        {
                            colunasObjeto = Gerador.MapeamentoProcedure.ListAllFieldsFromStoredProcedure(BancoSelecionado, nomeObjeto, Parametros, DadosLogin);
                        }
                        else
                        {
                            return retornaDados ? colunasObjeto : new List<DadosColunas>();
                        }

                        break;

                    default:
                        throw new ArgumentOutOfRangeException("tipo", "Tipo inválido");
                }

                if (retornaDados)
                {
                    return colunasObjeto;
                }
                //Carrega o objeto que deve ser exibido

                if (_objetosSelecionados == null)
                {
                    _objetosSelecionados = new List<KeyValuePair<TipoObjetoBanco, List<DadosColunas>>>();
                }

                _objetosSelecionados.Add(new KeyValuePair<TipoObjetoBanco, List<DadosColunas>>(new TipoObjetoBanco(nomeObjeto, tipo.ToString(), Parametros), colunasObjeto));
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("Erro:\n{0}", ex.Message), ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return null;
            }
            return null;
        }
        private void lvObjetosBanco_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (lvObjetosBanco.Items[e.Index].Group == lvObjetosBanco.Groups["procedure"] && e.NewValue == CheckState.Checked)
            {
                var nomesTiposObjeto = new TipoObjetoBanco(lvObjetosBanco.Items[e.Index].Text, lvObjetosBanco.Items[e.Index].SubItems[4].Text, new List<DadosStoredProceduresParameters>());

                Parametros = Gerador.MapeamentoProcedure.ListaAllStoredProceduresParameters(BancoSelecionado, DadosLogin, lvObjetosBanco.Items[e.Index].Text);

                if (Parametros.Count > 0)
                {
                    var frm = new frmParametros { Parametros = Parametros };

                    if (frm.ShowDialog(this) == DialogResult.Yes)
                    {
                        nomesTiposObjeto.Parametros = frm.Parametros;
                    }
                    else
                    {
                        MessageBox.Show("Não é possivel carregar os dadso da StoredProcedure sem o preenchimento dos parametros", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        e.NewValue = CheckState.Unchecked;
                        return;
                    }
                    frm.Dispose();
                }
                _imgObjetosMapeados.Add(new KeyValuePair<string, Image>(lvObjetosBanco.Items[e.Index].Text, ilIcones.Images["cheked"]));
                _objetosSelecionados.Add(new KeyValuePair<TipoObjetoBanco, List<DadosColunas>>(nomesTiposObjeto, CarregaCamposObjeto(nomesTiposObjeto.NomeObjeto, nomesTiposObjeto.TipoObjeto, true)));
            }

            if (e.NewValue == CheckState.Unchecked)
            {
                _objetosSelecionados = _objetosSelecionados.Where(o => o.Key.NomeObjeto != lvObjetosBanco.Items[e.Index].Text).ToList();
                _imgObjetosMapeados = _imgObjetosMapeados.Where(o => o.Key != lvObjetosBanco.Items[e.Index].Text).ToList();
            }
        }