string DefineOrdenacao(TabelaInfo tabela)
 {
     foreach (ColunaInfo c in tabela.colunas)
     {
         if (c.DescricaoReferencia.Contains("DESCRICAO") || c.DescricaoReferencia.Contains("NOME") || c.DescricaoReferencia.Contains("RAZAO") || c.DescricaoReferencia.Contains("FANTASIA"))
             return tabela.ClasseInfo + ".Columns." + c.DescricaoReferencia;
     }
     return tabela.ClasseInfo + ".Columns._ID";
 }
        bool CriarArquivos(string diretorio)
        {
            try
            {
                LimparDiretorio(diretorio);

                if (!Directory.Exists(diretorio))
                    Directory.CreateDirectory(diretorio);

                if (!Directory.Exists(diretorio + "\\ORM\\BaseModel"))
                    Directory.CreateDirectory(diretorio + "\\ORM\\BaseModel");

                if (!Directory.Exists(diretorio + "\\ORM\\Model"))
                    Directory.CreateDirectory(diretorio + "\\ORM\\Model");

                if (!Directory.Exists(diretorio + "\\ORM\\BaseBLL"))
                    Directory.CreateDirectory(diretorio + "\\ORM\\BaseBLL");

                if (!Directory.Exists(diretorio + "\\ORM\\BLL"))
                    Directory.CreateDirectory(diretorio + "\\ORM\\BLL");

                if (!Directory.Exists(diretorio + "\\ORM\\BaseDAL"))
                    Directory.CreateDirectory(diretorio + "\\ORM\\BaseDAL");

                if (!Directory.Exists(diretorio + "\\ORM\\DAL"))
                    Directory.CreateDirectory(diretorio + "\\ORM\\DAL");

                if (!Directory.Exists(diretorio + "\\WebService"))
                    Directory.CreateDirectory(diretorio + "\\WebService");

                if (!Directory.Exists(diretorio + "\\Comunicador\\BaseBLL"))
                    Directory.CreateDirectory(diretorio + "\\Comunicador\\BaseBLL");

                if (!Directory.Exists(diretorio + "\\Comunicador\\BLL"))
                    Directory.CreateDirectory(diretorio + "\\Comunicador\\BLL");

                if (!Directory.Exists(diretorio + "\\Util"))
                    Directory.CreateDirectory(diretorio + "\\Util");

                if (!Directory.Exists(diretorio + "\\BaseObjects"))
                    Directory.CreateDirectory(diretorio + "\\BaseObjects");

                if (!Directory.Exists(diretorio + "\\ConstantValues"))
                    Directory.CreateDirectory(diretorio + "\\ConstantValues");

                string pacoteORM = chkWebService.Checked ? "ORM" : txtPacote.Text;
                string pacote = txtPacote.Text;
                string pacoteWebService = chkWebService.Checked && !string.IsNullOrEmpty(txtPacoteWebService.Text) ? txtPacoteWebService.Text : pacote;
                string stringConexaoParams = chkStringConexao.Checked ? "string strConexao, " : "";
                string stringConexao = chkStringConexao.Checked ? "strConexao, " : "";

                string pacoteDB = rdbMySQL.Checked ? "MySql.Data.MySqlClient" : "System.Data.Common";

                string dbTransaction = rdbMySQL.Checked ? "MySqlTransaction" : "DbTransaction";
                string dbParameter = rdbMySQL.Checked ? "MySqlParameter" : "DbParameter";
                string dbType = rdbMySQL.Checked ? "MySqlDbType" : "DbType";
                string dbDataReader = rdbMySQL.Checked ? "MySqlDataReader" : "DbDataReader";
                string dbException = rdbMySQL.Checked ? "MySqlException" : "DbException";

                string dbTypeBoolean = rdbMySQL.Checked ? "Bit" : "Boolean";

                string dataPadraoCriacao = "datahora_criacao";
                string dataPadraoAlteracao = "datahora_alteracao";

                string comando = @"
                    SELECT *, 0 as ordenar
                       FROM INFORMATION_SCHEMA.`TABLES`
                      WHERE TABLE_SCHEMA = ?TABLE_NAME
                        AND TABLE_TYPE   = 'BASE TABLE';";
                MySqlParameter[] parms = new MySqlParameter[1];
                parms[0] = Accessor.Funcoes.CreateParameter("?TABLE_NAME", MySqlDbType.VarChar, cmbDatabase.Text);

                DataTable dtTablesOrigin = Accessor.Funcoes.FillDataTable(CommandType.Text, comando, parms);

                List<TabelaInfo> tabelas = new List<TabelaInfo>();

                foreach (DataRow r in dtTablesOrigin.Rows)
                {
                    string nomeTabela = r["table_name"].ToString().ToLower();

                    TabelaInfo tabela = new TabelaInfo();
                    tabela.SiglaInicial = txtSiglaInicial.Text;
                    tabela.Descricao = nomeTabela;

                    tabelas.Add(tabela);

                    string recoverSelectColumn = @"
                        SELECT *, if (column_key = 'PRI', '9999', '') as ordernarKey
                           FROM INFORMATION_SCHEMA.`COLUMNS`
                          WHERE TABLE_NAME   = ?TABLE_NAME
                            AND TABLE_SCHEMA = ?TABLE_SCHEMA
                         ORDER BY ordernarKey desc, ORDINAL_POSITION;";

                    parms = new MySqlParameter[2];
                    parms[0] = Accessor.Funcoes.CreateParameter("?TABLE_NAME", MySqlDbType.VarChar, nomeTabela);
                    parms[1] = Accessor.Funcoes.CreateParameter("?TABLE_SCHEMA", MySqlDbType.VarChar, cmbDatabase.Text);

                    StringBuilder _columns = new StringBuilder();
                    List<string> primaryKeys = new List<string>();

                    ColunaInfo coluna = null;
                    using (MySqlDataReader rdr = Accessor.Funcoes.ExecuteReader(CommandType.Text, recoverSelectColumn, parms))
                    {
                        while (rdr.Read())
                        {
                            coluna = new ColunaInfo();
                            coluna.ChavePrimaria = rdr["column_key"].ToString().ToLower().Contains("pri");
                            coluna.Descricao = rdr["column_name"].ToString();
                            coluna.Tipo = rdr["column_type"].ToString();
                            coluna.TamanhoMaximoTexto = Accessor.Funcoes.ConvertToInt32(rdr["character_maximum_length"].ToString());
                            coluna.Default = rdr["column_default"].ToString();
                            coluna.Comentario = rdr["column_comment"].ToString();
                            coluna.AceitaNulo = rdr["is_nullable"].ToString().ToLower().Contains("yes");
                            coluna.AutoIncremento = rdr["extra"].ToString().ToLower().Contains("auto_increment");
                            coluna.Index = rdr["column_key"].ToString().ToLower().Contains("mul");

                            tabela.colunas.Add(coluna);

                            if (rdr["column_key"].ToString().ToLower().Contains("pri"))
                                primaryKeys.Add(rdr["column_name"].ToString());
                        }
                    }

                    if (tabela.colunas.Find(p => p.ChavePrimaria) == null)
                    {
                        bool encontrouChavePrimaria = false;
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            if (c.DescricaoDB.ToLower().Contains("id"))
                            {
                                c.ChavePrimaria = true;
                                encontrouChavePrimaria = true;
                                break;
                            }
                        }
                        if (!encontrouChavePrimaria)
                        {
                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                c.ChavePrimaria = true;
                                break;
                            }
                        }
                    }

                    #region CriaArquivo Base Model
                    File.Create(diretorio + "\\ORM\\BaseModel\\" + tabela.ArquivoModel).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\ORM\\BaseModel\\" + tabela.ArquivoModel))
                    {
                        bool existeLazyLoading = (tabela.colunas.Find(p => !p.ChavePrimaria && (p.Descricao.ToLower().EndsWith("_id") || p.Descricao.ToLower().StartsWith("id"))) != null);
                        bool existeComment = (tabela.colunas.Find(p => !string.IsNullOrEmpty(p.Comentario)) != null);

                        arquivo.WriteLine("using " + pacoteDB + ";");
                        arquivo.WriteLine("using System;");
                        if (existeComment)
                            arquivo.WriteLine("using Newtonsoft.Json;");
                        arquivo.WriteLine("using " + pacoteORM + ".BaseObjects;");
                        arquivo.WriteLine("using " + pacoteORM + ".Library.DAL;");
                        arquivo.WriteLine("using " + pacoteORM + ".Util;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("namespace " + pacoteORM + ".Library.Model");
                        arquivo.WriteLine("{");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public partial class " + tabela.ClasseInfo + " : BaseInfo");
                        arquivo.WriteLine("    {");
                        arquivo.WriteLine("        private Funcoes mFuncoes;");
                        arquivo.WriteLine("");

                        // Cria variaveis privadas
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            if (!string.IsNullOrEmpty(c.Comentario) && c.Comentario != "notjson" && !c.Comentario.Contains("|") && !c.Comentario.Contains(" ") && !c.Comentario.Contains("-") && !c.Comentario.Contains(";"))
                                arquivo.WriteLine("        [JsonProperty(\"" + c.Comentario + "\")]");

                            if (c.ChavePrimaria)
                                arquivo.WriteLine("        public long " + c.Descricao + " { get; set; }");
                            else if (c.TipoVariavel.Equals(TipoVariavelEnum.DateTime))
                                arquivo.WriteLine("        public " + EnumDescription.GetDescription(c.TipoVariavel) + "? " + c.Descricao + " { get; set; }");
                            else
                            {
                                if (chkValidacoesColuna.Checked && c.AceitaNulo && string.IsNullOrEmpty(c.Default) && !TipoVariavelEnum.String.Equals(c.TipoVariavel))
                                    arquivo.WriteLine("        public " + EnumDescription.GetDescription(c.TipoVariavel) + "? " + c.Descricao + " { get; set; }");
                                else
                                    arquivo.WriteLine("        public " + EnumDescription.GetDescription(c.TipoVariavel) + " " + c.Descricao + " { get; set; }");
                            }
                        }

                        // Cria variaveis de classes relacionais
                        if (existeLazyLoading)
                        {
                            arquivo.WriteLine("");
                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                if (!string.IsNullOrEmpty(c.ClasseRelacionalInfo))
                                {
                                    if (existeComment)
                                        arquivo.WriteLine("        [JsonProperty(\"" + c.ClasseRelacionalApelido + "\")]");

                                    arquivo.WriteLine("        public " + c.ClasseRelacionalInfo + " " + c.ClasseRelacionalApelido + " { get; set; }");
                                }
                            }
                        }

                        arquivo.WriteLine("        public " + tabela.ClasseInfo + "()");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            mFuncoes = Funcoes.newInstance();");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public " + tabela.ClasseInfo + "(" + tabela.ClasseInfo + " t)");
                        arquivo.WriteLine("            : this()");
                        arquivo.WriteLine("        {");

                        // Cria variaveis no construtor da classe
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            arquivo.WriteLine("            this." + c.Descricao + " = t." + c.Descricao + ";");
                        }

                        // Cria variaveis de classes relacionais no construtor da classe
                        if (existeLazyLoading)
                        {
                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                if (!string.IsNullOrEmpty(c.ClasseRelacionalInfo))
                                    arquivo.WriteLine("            this." + c.ClasseRelacionalApelido + " = t." + c.ClasseRelacionalApelido + ";");
                            }
                        }

                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");


                        arquivo.WriteLine("    }");

                        arquivo.WriteLine("");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo Model
                    File.Create(diretorio + "\\ORM\\Model\\" + tabela.ArquivoModel).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\ORM\\Model\\" + tabela.ArquivoModel))
                    {
                        bool existeComment = (tabela.colunas.Find(p => !string.IsNullOrEmpty(p.Comentario)) != null);

                        arquivo.WriteLine("using " + pacoteDB + ";");
                        arquivo.WriteLine("using System;");
                        if (existeComment)
                            arquivo.WriteLine("using Newtonsoft.Json;");
                        arquivo.WriteLine("using " + pacoteORM + ".BaseObjects;");
                        arquivo.WriteLine("using " + pacoteORM + ".Library.DAL;");
                        arquivo.WriteLine("using " + pacoteORM + ".Util;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("namespace " + pacoteORM + ".Library.Model");
                        arquivo.WriteLine("{");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public partial class " + tabela.ClasseInfo + " : BaseInfo");
                        arquivo.WriteLine("    {");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo Base BLL
                    File.Create(diretorio + "\\ORM\\BaseBLL\\Base" + tabela.ArquivoBo).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\ORM\\BaseBLL\\Base" + tabela.ArquivoBo))
                    {
                        arquivo.WriteLine("using " + pacoteDB + ";");
                        arquivo.WriteLine("using " + pacoteORM + ".Library.DAL;");
                        arquivo.WriteLine("using " + pacoteORM + ".Library.Model;");
                        arquivo.WriteLine("using " + pacoteORM + ".Util;");
                        arquivo.WriteLine("using System;");
                        arquivo.WriteLine("using System.Collections.Generic;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("namespace " + pacoteORM + ".Library.BaseBLL");
                        arquivo.WriteLine("{");
                        arquivo.WriteLine("    public abstract class Base" + tabela.ClasseBo);
                        arquivo.WriteLine("    {");
                        arquivo.WriteLine("        protected static Base" + tabela.ClasseBo + " " + tabela.ApelidoBo + ";");
                        arquivo.WriteLine("        protected static Funcoes mFuncoes;");
                        arquivo.WriteLine("        protected static " + tabela.ClasseDao + " " + tabela.ApelidoDao + ";");
                        arquivo.WriteLine("");
                        if (chkValidacoesColuna.Checked)
                        {
                            arquivo.WriteLine("        protected static string erroCampoVazio = \"Campo {0} não pode ser vazio.\";");
                            arquivo.WriteLine("        protected static string erroCampoGrande = \"Campo {0} não pode ser ter mais do que {1} caracteres.\";");
                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("        protected Base" + tabela.ClasseBo + "()");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            mFuncoes = Funcoes.newInstance();");
                        arquivo.WriteLine("            " + tabela.ApelidoDao + " = DAOFactory.get" + tabela.ClasseDao + "();");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");

                        if (chkValidacoesColuna.Checked)
                        {
                            arquivo.WriteLine("        public void ValidarDados(" + tabela.ClasseInfo + " _obj)");
                            arquivo.WriteLine("        {");

                            bool primeiraVariavel = true;
                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                if (!c.ChavePrimaria)
                                {
                                    if (!c.AceitaNulo)
                                    {
                                        if (c.TipoVariavel.Equals(TipoVariavelEnum.String) &&
                                            c.DescricaoDB != dataPadraoCriacao)
                                        {
                                            if (primeiraVariavel)
                                                arquivo.WriteLine("            if (string.IsNullOrEmpty(_obj." + c.Descricao + "))");
                                            else
                                                arquivo.WriteLine("            else if (string.IsNullOrEmpty(_obj." + c.Descricao + "))");

                                            arquivo.WriteLine("                throw new Exception(string.Format(erroCampoVazio, \"" + c.Descricao + "\"));");

                                            if (c.TipoVariavel.Equals(TipoVariavelEnum.String) && c.TamanhoMaximoTexto > 0)
                                            {
                                                arquivo.WriteLine("            else if (_obj." + c.Descricao + ".Length > " + c.TamanhoMaximoTexto + ")");
                                                arquivo.WriteLine("                throw new Exception(string.Format(erroCampoGrande, \"" + c.Descricao + "\", " + c.TamanhoMaximoTexto + "));");
                                            }

                                            primeiraVariavel = false;
                                        }
                                    }
                                    else if (c.TipoVariavel.Equals(TipoVariavelEnum.String) && c.TamanhoMaximoTexto > 0 && c.DescricaoDB != dataPadraoCriacao)
                                    {
                                        if (primeiraVariavel)
                                            arquivo.WriteLine("            if (_obj." + c.Descricao + " != null && _obj." + c.Descricao + ".Length > " + c.TamanhoMaximoTexto + ")");
                                        else
                                            arquivo.WriteLine("            else if (_obj." + c.Descricao + " != null && _obj." + c.Descricao + ".Length > " + c.TamanhoMaximoTexto + ")");

                                        arquivo.WriteLine("                throw new Exception(string.Format(erroCampoGrande, \"" + c.Descricao + "\", " + c.TamanhoMaximoTexto + "));");

                                        primeiraVariavel = false;
                                    }
                                }
                            }

                            if (!primeiraVariavel)
                                arquivo.WriteLine("");

                            string chavePrimaria = tabela.colunas.Find(p => p.ChavePrimaria).Descricao;

                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                if (!c.ChavePrimaria)
                                {
                                    //if (!c.AceitaNulo && c.TipoVariavel.Equals(TipoVariavelEnum.DateTime) && c.DescricaoDB == dataPadraoCriacao)
                                    if (c.TipoVariavel.Equals(TipoVariavelEnum.DateTime) && c.DescricaoDB == dataPadraoCriacao)
                                    {
                                        arquivo.WriteLine("            if (_obj." + c.Descricao + " == null)");
                                        arquivo.WriteLine("                _obj." + c.Descricao + " = DateTime.Now;");
                                    }
                                    else if (c.TipoVariavel.Equals(TipoVariavelEnum.DateTime) && c.DescricaoDB == dataPadraoAlteracao)
                                    {
                                        arquivo.WriteLine("");
                                        arquivo.WriteLine("            if (_obj." + chavePrimaria + " > 0)");
                                        arquivo.WriteLine("                _obj." + c.Descricao + " = DateTime.Now;");
                                    }
                                }
                            }

                            arquivo.WriteLine("        }");
                        }

                        arquivo.WriteLine("        public bool Salvar(" + tabela.ClasseInfo + " _obj, " + dbTransaction + " _trans)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            try");
                        arquivo.WriteLine("            {");

                        if (chkValidacoesColuna.Checked)
                        {
                            arquivo.WriteLine("                ValidarDados(_obj);");
                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("                return " + tabela.ApelidoDao + ".Salvar(_obj, _trans);");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("            catch");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                throw;");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("        public bool Salvar(" + stringConexaoParams + tabela.ClasseInfo + " _obj)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            try");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                " + dbTransaction + " trans = mFuncoes.BeginTransaction(" + stringConexao.Replace(", ", "") + ");");
                        arquivo.WriteLine("                bool sucesso = Salvar(_obj, trans);");
                        arquivo.WriteLine("                if (sucesso)");
                        arquivo.WriteLine("                    mFuncoes.CommitTransaction(trans);");
                        arquivo.WriteLine("                else");
                        arquivo.WriteLine("                    mFuncoes.RollbackTransaction(trans);");
                        arquivo.WriteLine("                return sucesso;");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("            catch");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                throw;");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public bool Excluir(long Id, " + dbTransaction + " _trans)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            try");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                return " + tabela.ApelidoDao + ".Excluir(Id, _trans);");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("            catch");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                throw;");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("        public bool Excluir(" + stringConexaoParams + "long Id)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            try");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                " + dbTransaction + " trans = mFuncoes.BeginTransaction(" + stringConexao.Replace(", ", "") + ");");
                        arquivo.WriteLine("                bool sucesso = Excluir(Id, trans);");
                        arquivo.WriteLine("                if (sucesso)");
                        arquivo.WriteLine("                    mFuncoes.CommitTransaction(trans);");
                        arquivo.WriteLine("                else");
                        arquivo.WriteLine("                    mFuncoes.RollbackTransaction(trans);");
                        arquivo.WriteLine("                return sucesso;");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("            catch");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                throw;");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public " + tabela.ClasseInfo + " RetornaPorId(" + stringConexaoParams + "long Id, bool lazyLoading = false)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            try");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                return " + tabela.ApelidoDao + ".RetornaPorId(" + stringConexao + "Id, lazyLoading);");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("            catch");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                throw;");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");

                        string parametroLazyLoading = string.Empty;
                        string variavelLazyLoading = string.Empty;

                        List<ColunaInfo> joins = new List<ColunaInfo>();
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            bool lista = false;
                            bool join = false;

                            if (CriarSelect(c, ref lista, ref join))
                            {
                                if (join)
                                {
                                    joins.Add(c);

                                    parametroLazyLoading = ", bool lazyLoading = false";
                                    variavelLazyLoading = ", lazyLoading";
                                }

                                string variavel = c.TipoVariavel.ToString().StartsWith("S") ? c.TipoVariavel.ToString() : c.TipoVariavel.ToString().ToLower();

                                if (variavel.Equals("integer"))
                                    variavel = "int";

                                string pesquisaPor = "Por" + c.Descricao;

                                if (!lista)
                                {
                                    arquivo.WriteLine("        public " + tabela.ClasseInfo + " Retorna" + pesquisaPor + "(" + stringConexaoParams + variavel + " " + c.Descricao + parametroLazyLoading + ")");
                                    arquivo.WriteLine("        {");
                                    arquivo.WriteLine("            try");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                return " + tabela.ApelidoDao + ".Retorna" + pesquisaPor + "(" + stringConexao + c.Descricao + variavelLazyLoading + ");");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("            catch");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                throw;");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("        }");
                                    arquivo.WriteLine("");
                                }
                                else
                                {
                                    arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> Retorna" + pesquisaPor + "(" + stringConexaoParams + variavel + " " + c.Descricao + parametroLazyLoading + ")");
                                    arquivo.WriteLine("        {");
                                    arquivo.WriteLine("            try");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                return " + tabela.ApelidoDao + ".Retorna" + pesquisaPor + "(" + stringConexao + c.Descricao + variavelLazyLoading + ");");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("            catch");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                throw;");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("        }");
                                    arquivo.WriteLine("");
                                }
                            }
                        }

                        if (joins.Count > 1)
                        {
                            StringBuilder parametros = new StringBuilder();
                            StringBuilder parametrosPassar = new StringBuilder();

                            foreach (ColunaInfo c in joins)
                            {
                                string variavel = c.TipoVariavel.ToString().StartsWith("S") ? c.TipoVariavel.ToString() : c.TipoVariavel.ToString().ToLower();

                                parametros.Append(variavel + " " + c.Descricao + ", ");

                                parametrosPassar.Append(c.Descricao + ", ");
                            }

                            arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> RetornaPorParametros(" + stringConexaoParams + parametros.ToString().Remove(parametros.Length - 2, 2) + parametroLazyLoading + ")");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                return " + tabela.ApelidoDao + ".RetornaPorParametros(" + stringConexao + parametrosPassar.ToString().Remove(parametrosPassar.Length - 2, 2) + variavelLazyLoading + ");");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> RetornaTodos(" + (parametroLazyLoading.Length > 0 ? stringConexaoParams + parametroLazyLoading.Substring(2) : stringConexaoParams.Replace(", ", "")) + ")");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            try");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                return " + tabela.ApelidoDao + ".RetornaTodos(" + (variavelLazyLoading.Length > 0 ? stringConexao + variavelLazyLoading.Substring(2) : stringConexao.Replace(", ", "")) + ");");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("            catch");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                throw;");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo BLL
                    File.Create(diretorio + "\\ORM\\BLL\\" + tabela.ArquivoBo).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\ORM\\BLL\\" + tabela.ArquivoBo))
                    {
                        arquivo.WriteLine("using " + pacoteDB + ";");
                        arquivo.WriteLine("using " + pacoteORM + ".Library.BaseBLL;");
                        arquivo.WriteLine("using " + pacoteORM + ".Library.DAL;");
                        arquivo.WriteLine("using " + pacoteORM + ".Library.Model;");
                        arquivo.WriteLine("using " + pacoteORM + ".Util;");
                        arquivo.WriteLine("using System;");
                        arquivo.WriteLine("using System.Collections.Generic;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("namespace " + pacoteORM + ".Library.BLL");
                        arquivo.WriteLine("{");
                        arquivo.WriteLine("    public class " + tabela.ClasseBo + " : Base" + tabela.ClasseBo);
                        arquivo.WriteLine("    {");
                        arquivo.WriteLine("        private " + tabela.ClasseBo + "()");
                        arquivo.WriteLine("        { }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public static " + tabela.ClasseBo + " newInstance()");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            if (" + tabela.ApelidoBo + " == null)");
                        arquivo.WriteLine("                " + tabela.ApelidoBo + " = new " + tabela.ClasseBo + "();");
                        arquivo.WriteLine("            return (" + tabela.ClasseBo + ")" + tabela.ApelidoBo + ";");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo Base DAL
                    File.Create(diretorio + "\\ORM\\BaseDAL\\" + tabela.ArquivoDao).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\ORM\\BaseDAL\\" + tabela.ArquivoDao))
                    {
                        bool existeLazyLoading = (tabela.colunas.Find(p => !p.ChavePrimaria && (p.Descricao.ToLower().EndsWith("_id") || p.Descricao.ToLower().StartsWith("id"))) != null);
                        string chavePrimaria = tabela.colunas.Find(p => p.ChavePrimaria).Descricao;
                        string chavePrimariaDB = tabela.colunas.Find(p => p.ChavePrimaria).DescricaoDB;

                        arquivo.WriteLine("using " + pacoteDB + ";");
                        arquivo.WriteLine("using System;");
                        arquivo.WriteLine("using System.Collections.Generic;");
                        arquivo.WriteLine("using System.Data;");
                        arquivo.WriteLine("using System.Linq;");
                        arquivo.WriteLine("using " + pacoteORM + ".Library.Model;");
                        arquivo.WriteLine("using " + pacoteORM + ".Util;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("namespace " + pacoteORM + ".Library.DAL");
                        arquivo.WriteLine("{");
                        arquivo.WriteLine("    public partial class " + tabela.ClasseDao);
                        arquivo.WriteLine("    {");
                        arquivo.WriteLine("        private static Funcoes mFuncoes;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public " + tabela.ClasseDao + "()");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            mFuncoes = Funcoes.newInstance();");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        #region Parametros");

                        // Cria params das colunas, colunas, colunas de parametros e colunas de update

                        StringBuilder colunas = new StringBuilder();
                        StringBuilder colunasParametros = new StringBuilder();
                        StringBuilder colunasUpdate = new StringBuilder();

                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            arquivo.WriteLine("        const string param" + c.Descricao + " = \"?" + c.DescricaoDB + "\";");

                            if (!c.ChavePrimaria)
                            {
                                colunas.Append(c.DescricaoDB).Append(",");
                                colunasParametros.Append("?").Append(c.DescricaoDB).Append(",");
                                colunasUpdate.Append(c.DescricaoDB).Append("=?").Append(c.DescricaoDB).Append(",");
                            }
                        }

                        if (colunas.Length > 0)
                            colunas.Remove(colunas.Length - 1, 1);
                        if (colunasParametros.Length > 0)
                            colunasParametros.Remove(colunasParametros.Length - 1, 1);
                        if (colunasUpdate.Length > 0)
                            colunasUpdate.Remove(colunasUpdate.Length - 1, 1);

                        arquivo.WriteLine("        #endregion");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        #region Sql Commands");
                        arquivo.WriteLine("        const string colunas = \"" + colunas + "\";");
                        arquivo.WriteLine("        const string colunasParametros = \"" + colunasParametros + "\";");
                        arquivo.WriteLine("        const string colunasUpdate = \"" + colunasUpdate + "\";");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        const string cmdInserir = \"insert into " + tabela.Descricao + " (\" + colunas + \") values (\" + colunasParametros + \");\";");
                        arquivo.WriteLine("        const string cmdAlterar = \"update " + tabela.Descricao + " set \" + colunasUpdate + \" where " + chavePrimariaDB + "=?" + chavePrimariaDB + "\";");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        const string cmdExcluiPorId = \"delete from " + tabela.Descricao + " where " + chavePrimariaDB + "=?" + chavePrimariaDB + "\";");
                        arquivo.WriteLine("        const string cmdRetornaPorId = \"select * from " + tabela.Descricao + " where " + chavePrimariaDB + "=?" + chavePrimariaDB + "\";");

                        List<ColunaInfo> joins = new List<ColunaInfo>();
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            bool lista = false;
                            bool join = false;

                            if (CriarSelect(c, ref lista, ref join))
                            {
                                if (join)
                                    joins.Add(c);

                                string pesquisaPor = "Por" + c.Descricao;

                                arquivo.WriteLine("        const string cmdRetorna" + pesquisaPor + " = \"select * from " + tabela.Descricao + " where " + c.DescricaoDB + "=?" + c.DescricaoDB + "\";");
                            }
                        }

                        if (joins.Count > 1)
                        {
                            StringBuilder parametros = new StringBuilder();

                            foreach (ColunaInfo c in joins)
                                parametros.Append(c.DescricaoDB).Append("=?").Append(c.DescricaoDB).Append(" and ");

                            arquivo.WriteLine("        const string cmdRetornaPorParametros = \"select * from " + tabela.Descricao + " where " + parametros.Remove(parametros.Length - 5, 5) + "\";");
                        }


                        arquivo.WriteLine("        const string cmdRetornaTodos = \"select * from " + tabela.Descricao + ";\";");
                        arquivo.WriteLine("        #endregion");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public bool Inserir(" + tabela.ClasseInfo + " _obj, " + dbTransaction + " _trans)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            long id = 0;");
                        arquivo.WriteLine("            bool sucesso = mFuncoes.ExecuteNonQuery(_trans, CommandType.Text, cmdInserir, New" + tabela.Classe + "Parameters(_obj, false), out id);");
                        arquivo.WriteLine("            if (sucesso && id > 0)");
                        arquivo.WriteLine("                _obj." + chavePrimaria + " = id;");
                        arquivo.WriteLine("            return sucesso;");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public bool Atualizar(" + tabela.ClasseInfo + " _obj, " + dbTransaction + " _trans)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            return mFuncoes.ExecuteNonQuery(_trans, CommandType.Text, cmdAlterar, New" + tabela.Classe + "Parameters(_obj, true));");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public bool Salvar(" + tabela.ClasseInfo + " _obj, " + dbTransaction + " _trans)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            return _obj." + chavePrimaria + " == 0 ? Inserir(_obj, _trans) : Atualizar(_obj, _trans);");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public bool Excluir(long " + chavePrimaria + ", " + dbTransaction + " _trans)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            " + dbParameter + "[] parms = new " + dbParameter + "[1];");
                        arquivo.WriteLine("            parms[0] = mFuncoes.CreateParameter(param" + chavePrimaria + ", " + dbType + ".Int64, " + chavePrimaria + ");");
                        arquivo.WriteLine("            return mFuncoes.ExecuteNonQuery(_trans, CommandType.Text, cmdExcluiPorId, parms);");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public " + tabela.ClasseInfo + " RetornaPorId(" + stringConexaoParams + "long " + chavePrimaria + ", bool lazyLoading = false)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            " + dbParameter + "[] parms = new " + dbParameter + "[1];");
                        arquivo.WriteLine("            parms[0] = mFuncoes.CreateParameter(param" + chavePrimaria + ", " + dbType + ".Int64, " + chavePrimaria + ");");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("            using (" + dbDataReader + " rdr = mFuncoes.ExecuteReader(" + stringConexao + "CommandType.Text, cmdRetornaPorId, parms))");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                if (rdr.Read())");
                        arquivo.WriteLine("                    return New" + tabela.ClasseInfo + "(" + stringConexao + "rdr, lazyLoading);");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("            return null;");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");

                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            bool lista = false;
                            bool join = false;

                            if (CriarSelect(c, ref lista, ref join))
                            {
                                string variavel = EnumDescription.GetDescription(c.TipoVariavel);
                                string variavelDbType = "String";
                                if (c.TipoVariavel.Equals(TipoVariavelEnum.Int))
                                    variavelDbType = "Int32";
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Long))
                                    variavelDbType = "Int64";
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Decimal))
                                    variavelDbType = "Decimal";
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.DateTime))
                                    variavelDbType = "DateTime";
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Bool))
                                    variavelDbType = "Bool";
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Imagem))
                                    variavelDbType = "Image";

                                string pesquisaPor = "Por" + c.Descricao;

                                if (!lista)
                                {
                                    arquivo.WriteLine("        public " + tabela.ClasseInfo + " Retorna" + pesquisaPor + "(" + stringConexaoParams + variavel + " " + c.Descricao + ", bool lazyLoading = false)");
                                    arquivo.WriteLine("        {");
                                    arquivo.WriteLine("            " + dbParameter + "[] parms = new " + dbParameter + "[1];");
                                    arquivo.WriteLine("            parms[0] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + "." + variavelDbType + ", " + c.Descricao + ");");
                                    arquivo.WriteLine("");
                                    arquivo.WriteLine("            using (" + dbDataReader + " rdr = mFuncoes.ExecuteReader(" + stringConexao + "CommandType.Text, cmdRetorna" + pesquisaPor + ", parms))");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                if (rdr.Read())");
                                    arquivo.WriteLine("                    return New" + tabela.ClasseInfo + "(" + stringConexao + "rdr, lazyLoading);");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("            return null;");
                                    arquivo.WriteLine("        }");
                                    arquivo.WriteLine("");
                                }
                                else
                                {
                                    arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> Retorna" + pesquisaPor + "(" + stringConexaoParams + variavel + " " + c.Descricao + ", bool lazyLoading = false)");
                                    arquivo.WriteLine("        {");
                                    arquivo.WriteLine("            " + dbParameter + "[] parms = new " + dbParameter + "[1];");
                                    arquivo.WriteLine("            parms[0] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + "." + variavelDbType + ", " + c.Descricao + ");");
                                    arquivo.WriteLine("");
                                    arquivo.WriteLine("            List<" + tabela.ClasseInfo + "> lst = new List<" + tabela.ClasseInfo + ">();");
                                    arquivo.WriteLine("            using (" + dbDataReader + " rdr = mFuncoes.ExecuteReader(" + stringConexao + "CommandType.Text, cmdRetorna" + pesquisaPor + ", parms))");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                while (rdr.Read())");
                                    arquivo.WriteLine("                    lst.Add(New" + tabela.ClasseInfo + "(" + stringConexao + "rdr, lazyLoading));");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("            return lst;");
                                    arquivo.WriteLine("        }");
                                    arquivo.WriteLine("");
                                }
                            }
                        }

                        if (joins.Count > 1)
                        {
                            StringBuilder parametros = new StringBuilder();

                            foreach (ColunaInfo c in joins)
                            {
                                string variavel = EnumDescription.GetDescription(c.TipoVariavel);

                                parametros.Append(variavel + " " + c.Descricao + ", ");
                            }

                            arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> RetornaPorParametros(" + stringConexaoParams + parametros.ToString().Remove(parametros.Length - 2, 2) + ", bool lazyLoading = false)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            " + dbParameter + "[] parms = new " + dbParameter + "[" + joins.Count + "];");

                            int xParmsJoin = 0;
                            foreach (ColunaInfo c in joins)
                            {
                                string variavel = EnumDescription.GetDescription(c.TipoVariavel);
                                if (c.TipoVariavel.Equals(TipoVariavelEnum.Int))
                                    arquivo.WriteLine("            parms[" + xParmsJoin + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".Int32, " + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Long))
                                    arquivo.WriteLine("            parms[" + xParmsJoin + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".Int64, " + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Decimal))
                                    arquivo.WriteLine("            parms[" + xParmsJoin + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".Decimal, " + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.DateTime))
                                    arquivo.WriteLine("            parms[" + xParmsJoin + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".DateTime, " + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Bool))
                                    arquivo.WriteLine("            parms[" + xParmsJoin + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + "." + dbTypeBoolean + ", " + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Imagem))
                                    arquivo.WriteLine("            parms[" + xParmsJoin + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".LongBlob, mFuncoes.ConvertImageToByteArray(" + c.Descricao + "));");
                                else
                                    arquivo.WriteLine("            parms[" + xParmsJoin + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".String, " + c.Descricao + ");");

                                xParmsJoin++;
                            }

                            arquivo.WriteLine("");
                            arquivo.WriteLine("            List<" + tabela.ClasseInfo + "> lst = new List<" + tabela.ClasseInfo + ">();");
                            arquivo.WriteLine("            using (" + dbDataReader + " rdr = mFuncoes.ExecuteReader(" + stringConexao + "CommandType.Text, cmdRetornaPorParametros, parms))");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                while (rdr.Read())");
                            arquivo.WriteLine("                    lst.Add(New" + tabela.ClasseInfo + "(" + stringConexao + "rdr, lazyLoading));");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            return lst;");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> RetornaTodos(" + stringConexaoParams + "bool lazyLoading = false)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            List<" + tabela.ClasseInfo + "> lst = new List<" + tabela.ClasseInfo + ">();");
                        arquivo.WriteLine("            using (" + dbDataReader + " rdr = mFuncoes.ExecuteReader(" + stringConexao + "CommandType.Text, cmdRetornaTodos, null))");
                        arquivo.WriteLine("            {");
                        arquivo.WriteLine("                while (rdr.Read())");
                        arquivo.WriteLine("                    lst.Add(New" + tabela.ClasseInfo + "(" + stringConexao + "rdr, lazyLoading));");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("            return lst;");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");

                        arquivo.WriteLine("        " + dbParameter + "[] New" + tabela.Classe + "Parameters(" + tabela.ClasseInfo + " _obj, bool withId)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            " + dbParameter + "[] parms = new " + dbParameter + "[withId ? " + tabela.colunas.Count + " : " + (tabela.colunas.Count - 1) + "];");

                        // Adiciona os parametros de colunas que não sejam a chave primaria
                        int xParms = 0;
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            if (!c.ChavePrimaria)
                            {
                                if (c.TipoVariavel.Equals(TipoVariavelEnum.Int))
                                    arquivo.WriteLine("            parms[" + xParms + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".Int32, _obj." + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Long))
                                    arquivo.WriteLine("            parms[" + xParms + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".Int64, _obj." + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Decimal))
                                    arquivo.WriteLine("            parms[" + xParms + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".Decimal, _obj." + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.DateTime))
                                    arquivo.WriteLine("            parms[" + xParms + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".DateTime, _obj." + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Bool))
                                    arquivo.WriteLine("            parms[" + xParms + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + "." + dbTypeBoolean + ", _obj." + c.Descricao + ");");
                                else if (c.TipoVariavel.Equals(TipoVariavelEnum.Imagem))
                                    arquivo.WriteLine("            parms[" + xParms + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".LongBlob, mFuncoes.ConvertImageToByteArray(_obj." + c.Descricao + "));");
                                else
                                    arquivo.WriteLine("            parms[" + xParms + "] = mFuncoes.CreateParameter(param" + c.Descricao + ", " + dbType + ".String, _obj." + c.Descricao + ");");

                                xParms++;
                            }
                        }
                        // Adiciona o parametro do ID
                        arquivo.WriteLine("");
                        arquivo.WriteLine("            if (withId)");
                        arquivo.WriteLine("                parms[" + xParms + "] = mFuncoes.CreateParameter(param" + chavePrimaria + ", " + dbType + ".Int64, _obj." + chavePrimaria + ");");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("            return parms;");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        public " + tabela.ClasseInfo + " New" + tabela.ClasseInfo + "(" + stringConexaoParams + "" + dbDataReader + " rdr, bool lazyLoading = false)");
                        arquivo.WriteLine("        {");
                        arquivo.WriteLine("            " + tabela.ClasseInfo + " " + tabela.ApelidoInfo + " = new " + tabela.ClasseInfo + "();");

                        // Cria new info do data reader
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            if (c.ChavePrimaria)
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = mFuncoes.ConvertToInt64(rdr[\"" + c.DescricaoDB + "\"]);");
                            else if (c.TipoVariavel.Equals(TipoVariavelEnum.Int))
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = mFuncoes.ConvertToInt32(rdr[\"" + c.DescricaoDB + "\"]);");
                            else if (c.TipoVariavel.Equals(TipoVariavelEnum.Long))
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = mFuncoes.ConvertToInt64(rdr[\"" + c.DescricaoDB + "\"]);");
                            else if (c.TipoVariavel.Equals(TipoVariavelEnum.Decimal))
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = mFuncoes.ConvertToDecimal(rdr[\"" + c.DescricaoDB + "\"]);");
                            else if (c.TipoVariavel.Equals(TipoVariavelEnum.DateTime))
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = mFuncoes.GetDateTimeOrNull(rdr[\"" + c.DescricaoDB + "\"]);");
                            else if (c.TipoVariavel.Equals(TipoVariavelEnum.Bool))
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = mFuncoes.ConvertToBoolean(rdr[\"" + c.DescricaoDB + "\"]);");
                            else if (c.TipoVariavel.Equals(TipoVariavelEnum.Imagem))
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = mFuncoes.ConvertToImage(rdr, \"" + c.DescricaoDB + "\");");
                            else
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = mFuncoes.ConvertToString(rdr[\"" + c.DescricaoDB + "\"]);");
                        }

                        if (existeLazyLoading)
                        {
                            arquivo.WriteLine("");
                            arquivo.WriteLine("            if (lazyLoading)");
                            arquivo.WriteLine("                LazyLoadingMethod(" + stringConexao + "" + tabela.ApelidoInfo + ");");
                        }
                        arquivo.WriteLine("");
                        arquivo.WriteLine("            return " + tabela.ApelidoInfo + ";");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");

                        // Cria método lazy loading
                        if (existeLazyLoading)
                        {
                            arquivo.WriteLine("        void LazyLoadingMethod(" + stringConexaoParams + "" + tabela.ClasseInfo + " " + tabela.ApelidoInfo + ")");
                            arquivo.WriteLine("        {");

                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                if (!string.IsNullOrEmpty(c.ClasseRelacionalInfo))
                                {
                                    if (c.AceitaNulo)
                                    {
                                        arquivo.WriteLine("            if (" + tabela.ApelidoInfo + "." + c.Descricao + " != null && " + tabela.ApelidoInfo + "." + c.Descricao + " > 0)");
                                        arquivo.WriteLine("                " + tabela.ApelidoInfo + "." + c.ClasseRelacionalApelido + " = DAOFactory.get" + c.ClasseRelacionalDao + "().RetornaPorId(" + stringConexao + "" + tabela.ApelidoInfo + "." + c.Descricao + " ?? -1);");
                                        arquivo.WriteLine("");
                                    }
                                    else
                                    {
                                        arquivo.WriteLine("            if (" + tabela.ApelidoInfo + "." + c.Descricao + " > 0)");
                                        arquivo.WriteLine("                " + tabela.ApelidoInfo + "." + c.ClasseRelacionalApelido + " = DAOFactory.get" + c.ClasseRelacionalDao + "().RetornaPorId(" + stringConexao + "" + tabela.ApelidoInfo + "." + c.Descricao + ");");
                                        arquivo.WriteLine("");
                                    }
                                }
                            }

                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                        }
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo DAL
                    File.Create(diretorio + "\\ORM\\DAL\\" + tabela.ArquivoDao).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\ORM\\DAL\\" + tabela.ArquivoDao))
                    {
                        arquivo.WriteLine("using " + pacoteDB + ";");
                        arquivo.WriteLine("using System;");
                        arquivo.WriteLine("using System.Collections.Generic;");
                        arquivo.WriteLine("using System.Data;");
                        arquivo.WriteLine("using System.Linq;");
                        arquivo.WriteLine("using " + pacoteORM + ".Library.Model;");
                        arquivo.WriteLine("using " + pacoteORM + ".Util;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("namespace " + pacoteORM + ".Library.DAL");
                        arquivo.WriteLine("{");
                        arquivo.WriteLine("    public partial class " + tabela.ClasseDao);
                        arquivo.WriteLine("    {");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo WebService Base
                    if (chkWebService.Checked)
                    {
                        File.Create(diretorio + "\\WebService\\Base" + tabela.ArquivoWebService.Replace(".cs", "")).Close();
                        using (TextWriter arquivo = File.AppendText(diretorio + "\\WebService\\Base" + tabela.ArquivoWebService.Replace(".cs", "")))
                        {
                            arquivo.WriteLine("<%@ WebService Language=\"C#\" CodeBehind=\"Base" + tabela.ArquivoWebService + "\" Class=\"" + pacoteWebService + "." + tabela.ClasseWebService + "\" %>");
                            arquivo.Flush();
                            arquivo.Close();
                        }

                        File.Create(diretorio + "\\WebService\\Base" + tabela.ArquivoWebService).Close();
                        using (TextWriter arquivo = File.AppendText(diretorio + "\\WebService\\Base" + tabela.ArquivoWebService))
                        {
                            string chavePrimaria = tabela.colunas.Find(p => p.ChavePrimaria).Descricao;
                            string chavePrimariaDB = tabela.colunas.Find(p => p.ChavePrimaria).DescricaoDB;

                            arquivo.WriteLine("using " + pacoteDB + ";");
                            arquivo.WriteLine("using Newtonsoft.Json;");
                            arquivo.WriteLine("using System;");
                            arquivo.WriteLine("using System.Collections.Generic;");
                            arquivo.WriteLine("using System.Configuration;");
                            arquivo.WriteLine("using System.Data;");
                            arquivo.WriteLine("using System.IO;");
                            arquivo.WriteLine("using System.Text;");
                            arquivo.WriteLine("using System.Web.Configuration;");
                            arquivo.WriteLine("using System.Web.Script.Services;");
                            arquivo.WriteLine("using System.Web.Services;");
                            arquivo.WriteLine("using " + pacoteWebService + ".Util;");
                            arquivo.WriteLine("using " + pacoteORM + ".Library.BLL;");
                            arquivo.WriteLine("using System.Web;");
                            arquivo.WriteLine("using " + pacoteORM + ".Library.Model;");
                            arquivo.WriteLine("using " + pacoteWebService + ".Library.Model;");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("namespace " + pacoteWebService);
                            arquivo.WriteLine("{");
                            arquivo.WriteLine("    /// <summary>");
                            arquivo.WriteLine("    /// Summary description for " + tabela.ClasseWebService);
                            arquivo.WriteLine("    /// </summary>");
                            arquivo.WriteLine("    [WebService(Namespace = \"http://tempuri.org/\")]");
                            arquivo.WriteLine("    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]");
                            arquivo.WriteLine("    [System.ComponentModel.ToolboxItem(false)]");
                            arquivo.WriteLine("    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. ");
                            arquivo.WriteLine("    // [System.Web.Script.Services.ScriptService]");
                            arquivo.WriteLine("    public partial class " + tabela.ClasseWebService + " : System.Web.Services.WebService");
                            arquivo.WriteLine("    {");
                            arquivo.WriteLine("        class Accessor");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            static Funcoes funcoes;");
                            arquivo.WriteLine("            internal static Funcoes Funcoes");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                get");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    try");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        if (funcoes == null)");
                            arquivo.WriteLine("                            funcoes = Funcoes.newInstance();");
                            arquivo.WriteLine("                        return funcoes;");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                    catch (Exception err)");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        throw new Exception(err.Message);");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("            static " + pacoteORM + ".Util.Funcoes funcoesDB;");
                            arquivo.WriteLine("            internal static " + pacoteORM + ".Util.Funcoes FuncoesDB");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                get");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    try");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        if (funcoesDB == null)");
                            arquivo.WriteLine("                            funcoesDB = ORM.Util.Funcoes.newInstance();");
                            arquivo.WriteLine("                        return funcoesDB;");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                    catch (Exception err)");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        throw new Exception(err.Message);");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("            static " + tabela.ClasseBo + " " + tabela.ApelidoBo + ";");
                            arquivo.WriteLine("            internal static " + tabela.ClasseBo + " " + tabela.ClasseBo);
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                get");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    try");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        if (" + tabela.ApelidoBo + " == null)");
                            arquivo.WriteLine("                            " + tabela.ApelidoBo + " = " + tabela.ClasseBo + ".newInstance();");
                            arquivo.WriteLine("                        return " + tabela.ApelidoBo + ";");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                    catch (Exception err)");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        throw new Exception(err.Message);");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        private void AjustaPaginaApenasJson(string json)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            HttpContext.Current.Response.ContentType = \"application/json\";");
                            arquivo.WriteLine("            HttpContext.Current.Response.Write(json);");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");

                            if (rdbSOAP.Checked)
                            {
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        public bool Salvar(" + tabela.ClasseInfo + " _obj)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                return SalvarInfo(_obj);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                throw;");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public string SalvarJson(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            bool sucesso = false;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                ResultWeb<" + tabela.ClasseInfo + "> info = JsonConvert.DeserializeObject<ResultWeb<" + tabela.ClasseInfo + ">>(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                sucesso = SalvarInfo(info.ResultInfo);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            { }");
                                arquivo.WriteLine("            return JsonConvert.SerializeObject(sucesso);");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public string SalvarJsonResult(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            ResultWeb<" + tabela.ClasseInfo + "> info = new ResultWeb<" + tabela.ClasseInfo + ">();");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.ResultInfo = JsonConvert.DeserializeObject<" + tabela.ClasseInfo + ">(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                if (!SalvarInfo(info.ResultInfo))");
                                arquivo.WriteLine("                    throw new Exception(\"Não foi possível salvar o registro.\");");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch (Exception ex)");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.setErrorMessage(ex.Message);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            return JsonConvert.SerializeObject(info);");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }
                            else
                            {
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public void SalvarJson(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            bool sucesso = false;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                ResultWeb<" + tabela.ClasseInfo + "> info = JsonConvert.DeserializeObject<ResultWeb<" + tabela.ClasseInfo + ">>(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                sucesso = SalvarInfo(info.ResultInfo);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            { }");
                                arquivo.WriteLine("            AjustaPaginaApenasJson(sucesso.ToString());");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public void SalvarJsonResult(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            ResultWeb<" + tabela.ClasseInfo + "> info = new ResultWeb<" + tabela.ClasseInfo + ">();");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.ResultInfo = JsonConvert.DeserializeObject<" + tabela.ClasseInfo + ">(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                if (!SalvarInfo(info.ResultInfo))");
                                arquivo.WriteLine("                    throw new Exception(\"Não foi possível salvar o registro.\");");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch (Exception ex)");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.setErrorMessage(ex.Message);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            AjustaPaginaApenasJson(info.ToJson());");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }

                            arquivo.WriteLine("        private bool SalvarInfo(" + tabela.ClasseInfo + " _obj)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                if (Accessor." + tabela.ClasseBo + ".Salvar(_obj))");
                            arquivo.WriteLine("                    return true;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            return false;");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                            if (rdbSOAP.Checked)
                            {
                                arquivo.WriteLine("		   [WebMethod]");
                                arquivo.WriteLine("        public bool SalvarList(List<" + tabela.ClasseInfo + "> _obj)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                return SalvarListInfo(_obj);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                throw;");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public string SalvarJsonList(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            bool sucesso = false;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                List<" + tabela.ClasseInfo + "> infos = JsonConvert.DeserializeObject<List<" + tabela.ClasseInfo + ">>(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                sucesso = SalvarList(infos);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            { }");
                                arquivo.WriteLine("            return JsonConvert.SerializeObject(sucesso);");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public string SalvarJsonListResult(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            ResultWeb<List<" + tabela.ClasseInfo + ">> info = new ResultWeb<List<" + tabela.ClasseInfo + ">>();");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.ResultInfo = JsonConvert.DeserializeObject<List<" + tabela.ClasseInfo + ">>(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                if (!SalvarList(info.ResultInfo))");
                                arquivo.WriteLine("                    throw new Exception(\"Não foi possível salvar os registros.\");");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch (Exception ex)");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.setErrorMessage(ex.Message);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            return JsonConvert.SerializeObject(info);");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }
                            else
                            {
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public void SalvarJsonList(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            bool sucesso = false;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                List<" + tabela.ClasseInfo + "> infos = JsonConvert.DeserializeObject<List<" + tabela.ClasseInfo + ">>(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                sucesso = SalvarList(infos);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            { }");
                                arquivo.WriteLine("            AjustaPaginaApenasJson(sucesso.ToString());");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public void SalvarJsonListResult(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            ResultWeb<List<" + tabela.ClasseInfo + ">> info = new ResultWeb<List<" + tabela.ClasseInfo + ">>();");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.ResultInfo = JsonConvert.DeserializeObject<List<" + tabela.ClasseInfo + ">>(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                if (!SalvarList(info.ResultInfo))");
                                arquivo.WriteLine("                    throw new Exception(\"Não foi possível salvar os registros.\");");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch (Exception ex)");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.setErrorMessage(ex.Message);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            AjustaPaginaApenasJson(info.ToJson());");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }

                            arquivo.WriteLine("        private bool SalvarListInfo(List<" + tabela.ClasseInfo + "> infos)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            bool sucesso = false;");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("            " + dbTransaction + " trans = null;");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                trans = Accessor.FuncoesDB.BeginTransaction();");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("                foreach (" + tabela.ClasseInfo + " t in infos)");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    sucesso = Accessor." + tabela.ClasseBo + ".Salvar(t, trans);");
                            arquivo.WriteLine("                    if (!sucesso)");
                            arquivo.WriteLine("                        break;");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("                if (sucesso)");
                            arquivo.WriteLine("                    Accessor.FuncoesDB.CommitTransaction(trans);");
                            arquivo.WriteLine("                else");
                            arquivo.WriteLine("                    Accessor.FuncoesDB.RollbackTransaction(trans);");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch (" + dbException + " ex)");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                try");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    if (trans != null)");
                            arquivo.WriteLine("                        Accessor.FuncoesDB.RollbackTransaction(trans);");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("                catch { }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch (Exception ex)");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                try");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    if (trans != null)");
                            arquivo.WriteLine("                        Accessor.FuncoesDB.RollbackTransaction(trans);");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("                catch { }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            return sucesso;");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");

                            if (rdbSOAP.Checked)
                            {
                                arquivo.WriteLine("		   [WebMethod]");
                                arquivo.WriteLine("        public bool Excluir(" + tabela.ClasseInfo + " _obj)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                return ExcluirInfo(_obj." + chavePrimaria + ");");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                throw;");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public bool ExcluirPorId(long Id)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            bool sucesso = false;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                sucesso = ExcluirInfo(Id);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            { }");
                                arquivo.WriteLine("            return sucesso;");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public string ExcluirJson(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            bool sucesso = false;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                ResultWeb<" + tabela.ClasseInfo + "> info = JsonConvert.DeserializeObject<ResultWeb<" + tabela.ClasseInfo + ">>(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                sucesso = ExcluirInfo(info.ResultInfo." + chavePrimaria + ");");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            { }");
                                arquivo.WriteLine("            return JsonConvert.SerializeObject(sucesso);");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }
                            else
                            {
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public void Excluir(long Id)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            bool sucesso = false;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                sucesso = ExcluirInfo(Id);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            { }");
                                arquivo.WriteLine("            AjustaPaginaApenasJson(sucesso.ToString());");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public void ExcluirJson(string json)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            bool sucesso = false;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                ResultWeb<" + tabela.ClasseInfo + "> info = JsonConvert.DeserializeObject<ResultWeb<" + tabela.ClasseInfo + ">>(json);");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                sucesso = ExcluirInfo(info.ResultInfo." + chavePrimaria + ");");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            { }");
                                arquivo.WriteLine("            AjustaPaginaApenasJson(sucesso.ToString());");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }

                            arquivo.WriteLine("        private bool ExcluirInfo(long Id)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                if (Accessor." + tabela.ClasseBo + ".Excluir(Id))");
                            arquivo.WriteLine("                    return true;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            return false;");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");

                            if (rdbSOAP.Checked)
                            {
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        public " + tabela.ClasseInfo + " RetornaPorId(long Id)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                return Accessor." + tabela.ClasseBo + ".RetornaPorId(Id);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                throw;");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public string RetornaPorIdJson(long Id)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            " + tabela.ClasseInfo + " info = null;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info = Accessor." + tabela.ClasseBo + ".RetornaPorId(Id);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                throw;");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            return JsonConvert.SerializeObject(info);");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }
                            else
                            {
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public void RetornaPorIdJson(long Id)");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            ResultWeb<" + tabela.ClasseInfo + "> info = new ResultWeb<" + tabela.ClasseInfo + ">();");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.ResultInfo = Accessor." + tabela.ClasseBo + ".RetornaPorId(Id);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch (Exception ex)");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.setErrorMessage(ex.Message);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            AjustaPaginaApenasJson(info.ToJson());");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }

                            List<ColunaInfo> joins = new List<ColunaInfo>();
                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                bool lista = false;
                                bool join = false;

                                if (CriarSelect(c, ref lista, ref join))
                                {
                                    if (join)
                                        joins.Add(c);

                                    string variavel = c.TipoVariavel.ToString().StartsWith("S") ? c.TipoVariavel.ToString() : c.TipoVariavel.ToString().ToLower();

                                    if (variavel.Equals("integer"))
                                        variavel = "int";

                                    string pesquisaPor = "Por" + c.Descricao;

                                    if (!lista)
                                    {
                                        if (rdbSOAP.Checked)
                                        {
                                            arquivo.WriteLine("        [WebMethod]");
                                            arquivo.WriteLine("        public " + tabela.ClasseInfo + " Retorna" + pesquisaPor + "(" + variavel + " " + c.Descricao + ")");
                                            arquivo.WriteLine("        {");
                                            arquivo.WriteLine("            try");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                return Accessor." + tabela.ClasseBo + ".Retorna" + pesquisaPor + "(" + c.Descricao + ");");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            catch");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                throw;");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("        }");
                                            arquivo.WriteLine("");
                                            arquivo.WriteLine("        [WebMethod]");
                                            arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                            arquivo.WriteLine("        public string Retorna" + pesquisaPor + "Json(" + variavel + " " + c.Descricao + ")");
                                            arquivo.WriteLine("        {");
                                            arquivo.WriteLine("            " + tabela.ClasseInfo + " info = null;");
                                            arquivo.WriteLine("            try");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                info = Accessor." + tabela.ClasseBo + ".Retorna" + pesquisaPor + "(" + c.Descricao + ");");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            catch");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                throw;");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            return JsonConvert.SerializeObject(info);");
                                            arquivo.WriteLine("        }");
                                            arquivo.WriteLine("");
                                        }
                                        else
                                        {
                                            arquivo.WriteLine("        [WebMethod]");
                                            arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                            arquivo.WriteLine("        public void Retorna" + pesquisaPor + "Json(" + variavel + " " + c.Descricao + ")");
                                            arquivo.WriteLine("        {");
                                            arquivo.WriteLine("            ResultWeb<" + tabela.ClasseInfo + "> info = new ResultWeb<" + tabela.ClasseInfo + ">();");
                                            arquivo.WriteLine("            try");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                info.ResultInfo = Accessor." + tabela.ClasseBo + ".Retorna" + pesquisaPor + "(" + c.Descricao + ");");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            catch (Exception ex)");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                info.setErrorMessage(ex.Message);");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            AjustaPaginaApenasJson(info.ToJson());");
                                            arquivo.WriteLine("        }");
                                            arquivo.WriteLine("");
                                        }
                                    }
                                    else
                                    {
                                        if (rdbSOAP.Checked)
                                        {
                                            arquivo.WriteLine("        [WebMethod]");
                                            arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> Retorna" + pesquisaPor + "(" + variavel + " " + c.Descricao + ")");
                                            arquivo.WriteLine("        {");
                                            arquivo.WriteLine("            try");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                return Accessor." + tabela.ClasseBo + ".Retorna" + pesquisaPor + "(" + c.Descricao + ");");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            catch");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                throw;");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("        }");
                                            arquivo.WriteLine("");
                                            arquivo.WriteLine("        [WebMethod]");
                                            arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                            arquivo.WriteLine("        public string Retorna" + pesquisaPor + "Json(" + variavel + " " + c.Descricao + ")");
                                            arquivo.WriteLine("        {");
                                            arquivo.WriteLine("            List<" + tabela.ClasseInfo + "> info = null;");
                                            arquivo.WriteLine("            try");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                info = Accessor." + tabela.ClasseBo + ".Retorna" + pesquisaPor + "(" + c.Descricao + ");");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            catch");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                throw;");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            return JsonConvert.SerializeObject(info);");
                                            arquivo.WriteLine("        }");
                                            arquivo.WriteLine("");
                                        }
                                        else
                                        {
                                            arquivo.WriteLine("        [WebMethod]");
                                            arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                            arquivo.WriteLine("        public void Retorna" + pesquisaPor + "Json(" + variavel + " " + c.Descricao + ")");
                                            arquivo.WriteLine("        {");
                                            arquivo.WriteLine("            ResultWeb<List<" + tabela.ClasseInfo + ">> info = new ResultWeb<List<" + tabela.ClasseInfo + ">>();");
                                            arquivo.WriteLine("            try");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                info.ResultInfo = Accessor." + tabela.ClasseBo + ".Retorna" + pesquisaPor + "(" + c.Descricao + ");");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            catch (Exception ex)");
                                            arquivo.WriteLine("            {");
                                            arquivo.WriteLine("                info.setErrorMessage(ex.Message);");
                                            arquivo.WriteLine("            }");
                                            arquivo.WriteLine("            AjustaPaginaApenasJson(info.ToJson());");
                                            arquivo.WriteLine("        }");
                                            arquivo.WriteLine("");
                                        }
                                    }
                                }
                            }

                            if (joins.Count > 1)
                            {
                                StringBuilder parametros = new StringBuilder();
                                StringBuilder parametrosPassar = new StringBuilder();

                                foreach (ColunaInfo c in joins)
                                {
                                    string variavel = c.TipoVariavel.ToString().StartsWith("S") ? c.TipoVariavel.ToString() : c.TipoVariavel.ToString().ToLower();

                                    parametros.Append(variavel + " " + c.Descricao + ", ");

                                    parametrosPassar.Append(c.Descricao + ", ");
                                }

                                if (rdbSOAP.Checked)
                                {
                                    arquivo.WriteLine("        [WebMethod]");
                                    arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> RetornaPorParametros(" + parametros.ToString().Remove(parametros.Length - 2, 2) + ")");
                                    arquivo.WriteLine("        {");
                                    arquivo.WriteLine("            try");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                return " + tabela.ApelidoDao + ".RetornaPorParametros(" + parametrosPassar.ToString().Remove(parametrosPassar.Length - 2, 2) + ");");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("            catch");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                throw;");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("        }");
                                    arquivo.WriteLine("");
                                    arquivo.WriteLine("        [WebMethod]");
                                    arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                    arquivo.WriteLine("        public string RetornaPorParametrosJson(" + parametros.ToString().Remove(parametros.Length - 2, 2) + ")");
                                    arquivo.WriteLine("        {");
                                    arquivo.WriteLine("            List<" + tabela.ClasseInfo + "> info = null;");
                                    arquivo.WriteLine("            try");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                info = Accessor." + tabela.ClasseBo + ".RetornaPorParametros(" + parametrosPassar.ToString().Remove(parametrosPassar.Length - 2, 2) + ");");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("            catch");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                throw;");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("            return JsonConvert.SerializeObject(info);");
                                    arquivo.WriteLine("        }");
                                    arquivo.WriteLine("");
                                }
                                else
                                {
                                    arquivo.WriteLine("        [WebMethod]");
                                    arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                    arquivo.WriteLine("        public void RetornaPorParametrosJson(" + parametros.ToString().Remove(parametros.Length - 2, 2) + ")");
                                    arquivo.WriteLine("        {");
                                    arquivo.WriteLine("            ResultWeb<List<" + tabela.ClasseInfo + ">> info = new ResultWeb<List<" + tabela.ClasseInfo + ">>();");
                                    arquivo.WriteLine("            try");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                info.ResultInfo = Accessor." + tabela.ClasseBo + ".RetornaPorParametros(" + parametrosPassar.ToString().Remove(parametrosPassar.Length - 2, 2) + ");");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("            catch (Exception ex)");
                                    arquivo.WriteLine("            {");
                                    arquivo.WriteLine("                info.setErrorMessage(ex.Message);");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("            AjustaPaginaApenasJson(info.ToJson());");
                                    arquivo.WriteLine("        }");
                                    arquivo.WriteLine("");
                                }
                            }

                            if (rdbSOAP.Checked)
                            {
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> RetornaTodos()");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                return Accessor." + tabela.ClasseBo + ".RetornaTodos();");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                throw;");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public string RetornaTodosJson()");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            List<" + tabela.ClasseInfo + "> info = null;");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info = Accessor." + tabela.ClasseBo + ".RetornaTodos();");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                throw;");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            return JsonConvert.SerializeObject(info);");
                                arquivo.WriteLine("        }");
                            }
                            else
                            {
                                arquivo.WriteLine("        [WebMethod]");
                                arquivo.WriteLine("        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]");
                                arquivo.WriteLine("        public void RetornaTodosJson()");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            ResultWeb<List<" + tabela.ClasseInfo + ">> info = new ResultWeb<List<" + tabela.ClasseInfo + ">>();");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.ResultInfo = Accessor." + tabela.ClasseBo + ".RetornaTodos();");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch (Exception ex)");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                info.setErrorMessage(ex.Message);");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            AjustaPaginaApenasJson(info.ToJson());");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }

                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("}");

                            arquivo.Flush();
                            arquivo.Close();
                        }
                    }
                    #endregion

                    #region CriaArquivo WebService
                    if (chkWebService.Checked)
                    {
                        File.Create(diretorio + "\\WebService\\" + tabela.ArquivoWebService.Replace(".cs", "")).Close();
                        using (TextWriter arquivo = File.AppendText(diretorio + "\\WebService\\" + tabela.ArquivoWebService.Replace(".cs", "")))
                        {
                            arquivo.WriteLine("<%@ WebService Language=\"C#\" CodeBehind=\"" + tabela.ArquivoWebService + "\" Class=\"" + pacoteWebService + "." + tabela.ClasseWebService + "\" %>");
                            arquivo.Flush();
                            arquivo.Close();
                        }

                        File.Create(diretorio + "\\WebService\\" + tabela.ArquivoWebService).Close();
                        using (TextWriter arquivo = File.AppendText(diretorio + "\\WebService\\" + tabela.ArquivoWebService))
                        {
                            arquivo.WriteLine("using " + pacoteDB + ";");
                            arquivo.WriteLine("using Newtonsoft.Json;");
                            arquivo.WriteLine("using System;");
                            arquivo.WriteLine("using System.Collections.Generic;");
                            arquivo.WriteLine("using System.Configuration;");
                            arquivo.WriteLine("using System.Data;");
                            arquivo.WriteLine("using System.IO;");
                            arquivo.WriteLine("using System.Text;");
                            arquivo.WriteLine("using System.Web.Configuration;");
                            arquivo.WriteLine("using System.Web.Script.Services;");
                            arquivo.WriteLine("using System.Web.Services;");
                            arquivo.WriteLine("using " + pacoteWebService + ".Util;");
                            arquivo.WriteLine("using " + pacoteORM + ".Library.BLL;");
                            arquivo.WriteLine("using System.Web;");
                            arquivo.WriteLine("using " + pacoteORM + ".Library.Model;");
                            arquivo.WriteLine("using " + pacoteWebService + ".Library.Model;");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("namespace " + pacoteWebService);
                            arquivo.WriteLine("{");
                            arquivo.WriteLine("    public partial class " + tabela.ClasseWebService + " : System.Web.Services.WebService");
                            arquivo.WriteLine("    {");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("}");

                            arquivo.Flush();
                            arquivo.Close();
                        }
                    }
                    #endregion

                    #region CriaArquivo COMUNICADOR Base BLL
                    if (chkWebService.Checked && !string.IsNullOrEmpty(txtPacoteWebService.Text))
                    {
                        bool newInstance = !chkComunicadorSemNewInstance.Checked;

                        File.Create(diretorio + "\\Comunicador\\BaseBLL\\" + tabela.ArquivoBo).Close();
                        using (TextWriter arquivo = File.AppendText(diretorio + "\\Comunicador\\BaseBLL\\" + tabela.ArquivoBo))
                        {
                            arquivo.WriteLine("using " + pacoteDB + ";");
                            if (newInstance)
                                arquivo.WriteLine("using " + pacote + ".Util;");
                            arquivo.WriteLine("using " + pacoteORM + ".BaseObjects;");
                            arquivo.WriteLine("using " + pacoteORM + ".Util;");
                            arquivo.WriteLine("using " + pacoteORM + ".Library.Model;");
                            arquivo.WriteLine("using " + pacoteORM + ".Library.DAL;");
                            arquivo.WriteLine("using System;");
                            arquivo.WriteLine("using System.Collections.Generic;");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("namespace " + pacote + ".Library.BLL");
                            arquivo.WriteLine("{");
                            arquivo.WriteLine("    public partial class " + tabela.ClasseBo);
                            arquivo.WriteLine("    {");
                            arquivo.WriteLine("        class Accessor");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            static Funcoes funcoes;");
                            arquivo.WriteLine("            internal static Funcoes Funcoes");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                get");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    try");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        if (funcoes == null)");
                            arquivo.WriteLine("                            funcoes = " + (newInstance ? " Funcoes.newInstance();" : "new Funcoes();"));
                            arquivo.WriteLine("                        return funcoes;");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                    catch (Exception err)");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        throw new Exception(err.Message);");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("            static " + pacoteORM + ".Util.Funcoes funcoesDB;");
                            arquivo.WriteLine("            internal static " + pacoteORM + ".Util.Funcoes FuncoesDB");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                get");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    try");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        if (funcoesDB == null)");
                            arquivo.WriteLine("                            funcoesDB = ORM.Util.Funcoes.newInstance();");
                            arquivo.WriteLine("                        return funcoesDB;");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                    catch (Exception err)");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        throw new Exception(err.Message);");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("            static " + pacoteORM + ".Library.BLL." + tabela.ClasseBo + " " + tabela.ApelidoBo + ";");
                            arquivo.WriteLine("            internal static " + pacoteORM + ".Library.BLL." + tabela.ClasseBo + " " + tabela.ClasseBo);
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                get");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    try");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        if (" + tabela.ApelidoBo + " == null)");
                            arquivo.WriteLine("                            " + tabela.ApelidoBo + " = " + pacoteORM + ".Library.BLL." + tabela.ClasseBo + ".newInstance();");
                            arquivo.WriteLine("                        return " + tabela.ApelidoBo + ";");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                    catch (Exception err)");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        throw new Exception(err.Message);");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("            static " + tabela.Classe + "Web." + tabela.Classe + "SoapClient _" + tabela.Classe + "Web;");
                            arquivo.WriteLine("            internal static " + tabela.Classe + "Web." + tabela.Classe + "SoapClient " + tabela.Classe + "Web");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                get");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    try");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        if (_" + tabela.Classe + "Web == null)");
                            arquivo.WriteLine("                            _" + tabela.Classe + "Web = new " + tabela.Classe + "Web." + tabela.Classe + "SoapClient();");
                            arquivo.WriteLine("                        return _" + tabela.Classe + "Web;");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                    catch (Exception err)");
                            arquivo.WriteLine("                    {");
                            arquivo.WriteLine("                        throw new Exception(err.Message);");
                            arquivo.WriteLine("                    }");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        public bool Salvar(" + tabela.ClasseInfo + " _obj, " + dbTransaction + " _trans)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                if (Configuracoes.WebService)");
                            arquivo.WriteLine("                    return Accessor." + tabela.Classe + "Web.Salvar(InfoLocalToInfoWeb(_obj));");
                            arquivo.WriteLine("                else");
                            arquivo.WriteLine("                    return Accessor." + tabela.ClasseBo + ".Salvar(_obj, _trans);");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("        public bool Salvar(" + tabela.ClasseInfo + " _obj)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                if (Configuracoes.WebService)");
                            arquivo.WriteLine("                    return Accessor." + tabela.Classe + "Web.Salvar(InfoLocalToInfoWeb(_obj));");
                            arquivo.WriteLine("                else");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    " + dbTransaction + " trans = Accessor.FuncoesDB.BeginTransaction();");
                            arquivo.WriteLine("                    bool sucesso = Salvar(_obj, trans);");
                            arquivo.WriteLine("                    if (sucesso)");
                            arquivo.WriteLine("                        Accessor.FuncoesDB.CommitTransaction(trans);");
                            arquivo.WriteLine("                    else");
                            arquivo.WriteLine("                        Accessor.FuncoesDB.RollbackTransaction(trans);");
                            arquivo.WriteLine("                    return sucesso;");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        public bool Excluir(long Id, " + dbTransaction + " _trans)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                if (Configuracoes.WebService)");
                            arquivo.WriteLine("                    return Accessor." + tabela.Classe + "Web.ExcluirPorId(Id);");
                            arquivo.WriteLine("                else");
                            arquivo.WriteLine("                    return Accessor." + tabela.ClasseBo + ".Excluir(Id, _trans);");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("        public bool Excluir(long Id)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                if (Configuracoes.WebService)");
                            arquivo.WriteLine("                    return Accessor." + tabela.Classe + "Web.ExcluirPorId(Id);");
                            arquivo.WriteLine("                else");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    " + dbTransaction + " trans = Accessor.FuncoesDB.BeginTransaction();");
                            arquivo.WriteLine("                    bool sucesso = Excluir(Id, trans);");
                            arquivo.WriteLine("                    if (sucesso)");
                            arquivo.WriteLine("                        Accessor.FuncoesDB.CommitTransaction(trans);");
                            arquivo.WriteLine("                    else");
                            arquivo.WriteLine("                        Accessor.FuncoesDB.RollbackTransaction(trans);");
                            arquivo.WriteLine("                    return sucesso;");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        public " + tabela.ClasseInfo + " RetornaPorId(long Id, bool lazyLoading = false)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                if (Configuracoes.WebService)");
                            arquivo.WriteLine("                    return InfoLocalFromInfoWeb(Accessor." + tabela.Classe + "Web.RetornaPorId(Id));");
                            arquivo.WriteLine("                else");
                            arquivo.WriteLine("                    return Accessor." + tabela.ClasseBo + ".RetornaPorId(Id, lazyLoading);");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");

                            string parametroLazyLoading = string.Empty;
                            string variavelLazyLoading = string.Empty;

                            List<ColunaInfo> joins = new List<ColunaInfo>();
                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                bool lista = false;
                                bool join = false;

                                if (CriarSelect(c, ref lista, ref join))
                                {
                                    if (join)
                                    {
                                        joins.Add(c);

                                        parametroLazyLoading = ", bool lazyLoading = false";
                                        variavelLazyLoading = ", lazyLoading";
                                    }

                                    string variavel = c.TipoVariavel.ToString().StartsWith("S") ? c.TipoVariavel.ToString() : c.TipoVariavel.ToString().ToLower();

                                    if (variavel.Equals("integer"))
                                        variavel = "int";

                                    string pesquisaPor = "Por" + c.Descricao;

                                    if (!lista)
                                    {
                                        arquivo.WriteLine("        public " + tabela.ClasseInfo + " Retorna" + pesquisaPor + "(" + variavel + " " + c.Descricao + parametroLazyLoading + ")");
                                        arquivo.WriteLine("        {");
                                        arquivo.WriteLine("            try");
                                        arquivo.WriteLine("            {");
                                        arquivo.WriteLine("                if (Configuracoes.WebService)");
                                        arquivo.WriteLine("                    return InfoLocalFromInfoWeb(Accessor." + tabela.Classe + "Web.Retorna" + pesquisaPor + "(" + c.Descricao + "));");
                                        arquivo.WriteLine("                else");
                                        arquivo.WriteLine("                    return Accessor." + tabela.ClasseBo + ".Retorna" + pesquisaPor + "(" + c.Descricao + variavelLazyLoading + ");");
                                        arquivo.WriteLine("            }");
                                        arquivo.WriteLine("            catch");
                                        arquivo.WriteLine("            {");
                                        arquivo.WriteLine("                throw;");
                                        arquivo.WriteLine("            }");
                                        arquivo.WriteLine("        }");
                                        arquivo.WriteLine("");
                                    }
                                    else
                                    {
                                        arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> Retorna" + pesquisaPor + "(" + variavel + " " + c.Descricao + parametroLazyLoading + ")");
                                        arquivo.WriteLine("        {");
                                        arquivo.WriteLine("            try");
                                        arquivo.WriteLine("            {");
                                        arquivo.WriteLine("                if (Configuracoes.WebService)");
                                        arquivo.WriteLine("                {");
                                        arquivo.WriteLine("                    List<" + tabela.Classe + "Web." + tabela.ClasseInfo + "> lst = new List<" + tabela.Classe + "Web." + tabela.ClasseInfo + ">(Accessor." + tabela.Classe + "Web.Retorna" + pesquisaPor + "(" + c.Descricao + "));");
                                        arquivo.WriteLine("");
                                        arquivo.WriteLine("                    return ListLocalFromListWeb(lst);");
                                        arquivo.WriteLine("                }");
                                        arquivo.WriteLine("                else");
                                        arquivo.WriteLine("                    return Accessor." + tabela.ClasseBo + ".Retorna" + pesquisaPor + "(" + c.Descricao + variavelLazyLoading + ");");
                                        arquivo.WriteLine("            }");
                                        arquivo.WriteLine("            catch");
                                        arquivo.WriteLine("            {");
                                        arquivo.WriteLine("                throw;");
                                        arquivo.WriteLine("            }");
                                        arquivo.WriteLine("        }");
                                        arquivo.WriteLine("");
                                    }
                                }
                            }

                            if (joins.Count > 1)
                            {
                                StringBuilder parametros = new StringBuilder();
                                StringBuilder parametrosPassar = new StringBuilder();

                                foreach (ColunaInfo c in joins)
                                {
                                    string variavel = c.TipoVariavel.ToString().StartsWith("S") ? c.TipoVariavel.ToString() : c.TipoVariavel.ToString().ToLower();

                                    parametros.Append(variavel + " " + c.Descricao + ", ");

                                    parametrosPassar.Append(c.Descricao + ", ");
                                }

                                arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> RetornaPorParametros(" + parametros.ToString().Remove(parametros.Length - 2, 2) + parametroLazyLoading + ")");
                                arquivo.WriteLine("        {");
                                arquivo.WriteLine("            try");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                if (Configuracoes.WebService)");
                                arquivo.WriteLine("                {");
                                arquivo.WriteLine("                    List<" + tabela.Classe + "Web." + tabela.ClasseInfo + "> lst = new List<" + tabela.Classe + "Web." + tabela.ClasseInfo + ">(Accessor." + tabela.Classe + "Web.RetornaPorParametros(" + parametrosPassar.ToString().Remove(parametrosPassar.Length - 2, 2) + ");");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("                    return ListLocalFromListWeb(lst);");
                                arquivo.WriteLine("                }");
                                arquivo.WriteLine("                else");
                                arquivo.WriteLine("                    return Accessor." + tabela.ClasseBo + ".RetornaPorParametros(" + parametrosPassar.ToString().Remove(parametrosPassar.Length - 2, 2) + variavelLazyLoading + ");");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("            catch");
                                arquivo.WriteLine("            {");
                                arquivo.WriteLine("                throw;");
                                arquivo.WriteLine("            }");
                                arquivo.WriteLine("        }");
                                arquivo.WriteLine("");
                            }

                            arquivo.WriteLine("        public List<" + tabela.ClasseInfo + "> RetornaTodos(" + (parametroLazyLoading.Length > 0 ? parametroLazyLoading.Substring(2) : "") + ")");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            try");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                if (Configuracoes.WebService)");
                            arquivo.WriteLine("                {");
                            arquivo.WriteLine("                    List<" + tabela.Classe + "Web." + tabela.ClasseInfo + "> lst = new List<" + tabela.Classe + "Web." + tabela.ClasseInfo + ">(Accessor." + tabela.Classe + "Web.RetornaTodos());");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("                    return ListLocalFromListWeb(lst);");
                            arquivo.WriteLine("                }");
                            arquivo.WriteLine("                else");
                            arquivo.WriteLine("                    return Accessor." + tabela.ClasseBo + ".RetornaTodos(" + (variavelLazyLoading.Length > 0 ? variavelLazyLoading.Substring(2) : "") + ");");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("            catch");
                            arquivo.WriteLine("            {");
                            arquivo.WriteLine("                throw;");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        protected List<" + tabela.ClasseInfo + "> ListLocalFromListWeb(List<" + tabela.Classe + "Web." + tabela.ClasseInfo + "> lst)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            List<" + tabela.ClasseInfo + "> lstFinal = new List<" + tabela.ClasseInfo + ">();");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("            foreach (" + tabela.Classe + "Web." + tabela.ClasseInfo + " p in lst)");
                            arquivo.WriteLine("                lstFinal.Add(InfoLocalFromInfoWeb(p));");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("            return lstFinal;");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        protected " + tabela.Classe + "Web." + tabela.ClasseInfo + " InfoLocalToInfoWeb(" + tabela.ClasseInfo + " info)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            " + tabela.Classe + "Web." + tabela.ClasseInfo + " " + tabela.ApelidoInfo + " = new " + tabela.Classe + "Web." + tabela.ClasseInfo + "();");
                            arquivo.WriteLine("");
                            // Cria new info do data reader
                            foreach (ColunaInfo c in tabela.colunas)
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = info." + c.Descricao + ";");

                            arquivo.WriteLine("");
                            arquivo.WriteLine("            return " + tabela.ApelidoInfo + ";");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        protected " + tabela.ClasseInfo + " InfoLocalFromInfoWeb(" + tabela.Classe + "Web." + tabela.ClasseInfo + " info)");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            " + tabela.ClasseInfo + " " + tabela.ApelidoInfo + " = new " + tabela.ClasseInfo + "();");
                            arquivo.WriteLine("");
                            // Cria new info do data reader
                            foreach (ColunaInfo c in tabela.colunas)
                                arquivo.WriteLine("            " + tabela.ApelidoInfo + "." + c.Descricao + " = info." + c.Descricao + ";");

                            arquivo.WriteLine("");
                            arquivo.WriteLine("            return " + tabela.ApelidoInfo + ";");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("}");

                            arquivo.Flush();
                            arquivo.Close();
                        }
                    }
                    #endregion

                    #region CriaArquivo COMUNICADOR BLL
                    if (chkWebService.Checked && !string.IsNullOrEmpty(txtPacoteWebService.Text))
                    {
                        bool newInstance = !chkComunicadorSemNewInstance.Checked;

                        File.Create(diretorio + "\\Comunicador\\BLL\\" + tabela.ArquivoBo).Close();
                        using (TextWriter arquivo = File.AppendText(diretorio + "\\Comunicador\\BLL\\" + tabela.ArquivoBo))
                        {
                            arquivo.WriteLine("using " + pacoteDB + ";");
                            if (newInstance)
                                arquivo.WriteLine("using " + pacote + ".Util;");
                            arquivo.WriteLine("using " + pacoteORM + ".BaseObjects;");
                            arquivo.WriteLine("using " + pacoteORM + ".Util;");
                            arquivo.WriteLine("using " + pacoteORM + ".Library.Model;");
                            arquivo.WriteLine("using " + pacoteORM + ".Library.DAL;");
                            arquivo.WriteLine("using System;");
                            arquivo.WriteLine("using System.Collections.Generic;");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("namespace " + pacote + ".Library.BLL");
                            arquivo.WriteLine("{");
                            arquivo.WriteLine("    public partial class " + tabela.ClasseBo);
                            arquivo.WriteLine("    {");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("}");

                            arquivo.Flush();
                            arquivo.Close();
                        }
                    }
                    #endregion

                    if (rdbFuncoesWebService.Checked)
                    {
                        #region CriaArquivo Funcoes Web
                        File.Create(diretorio + "\\Util\\Funcoes.cs").Close();
                        using (TextWriter arquivo = File.AppendText(diretorio + "\\Util\\Funcoes.cs"))
                        {
                            arquivo.Write(Library.ArquivoFuncoesWeb.RetornaTextoArquivo(txtPacote.Text));

                            arquivo.Flush();
                            arquivo.Close();
                        }
                        #endregion
                    }
                    else if (rdbFuncoesForm.Checked)
                    {
                        #region CriaArquivo Funcoes ADO.NET Form
                        File.Create(diretorio + "\\Util\\Funcoes.cs").Close();
                        using (TextWriter arquivo = File.AppendText(diretorio + "\\Util\\Funcoes.cs"))
                        {
                            arquivo.Write(Library.ArquivoFuncoesADONetForm.RetornaTextoArquivo(txtPacote.Text));

                            arquivo.Flush();
                            arquivo.Close();
                        }
                        #endregion
                    }

                    #region CriaArquivo BaseInfo
                    File.Create(diretorio + "\\BaseObjects\\BaseInfo.cs").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\BaseObjects\\BaseInfo.cs"))
                    {
                        arquivo.Write(Library.ArquivoBaseInfo.RetornaTextoArquivo(txtPacote.Text));

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo Enumeradores
                    File.Create(diretorio + "\\ConstantValues\\Enumeradores.cs").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\ConstantValues\\Enumeradores.cs"))
                    {
                        arquivo.Write(Library.ArquivoEnumeradores.RetornaTextoArquivo(txtPacote.Text));

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion
                }

                if (tabelas.Count > 0)
                {
                    #region CriaArquivo DAOFactory
                    File.Create(diretorio + "\\ORM\\DAL\\DAOFactory.cs").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\ORM\\DAL\\DAOFactory.cs"))
                    {
                        arquivo.WriteLine("namespace " + pacoteORM + ".Library.DAL");
                        arquivo.WriteLine("{");
                        arquivo.WriteLine("    public class DAOFactory");
                        arquivo.WriteLine("    {");

                        foreach (TabelaInfo t in tabelas)
                        {
                            arquivo.WriteLine("        private static " + t.ClasseDao + " " + t.ApelidoDao + ";");
                        }

                        arquivo.WriteLine("");

                        foreach (TabelaInfo t in tabelas)
                        {
                            arquivo.WriteLine("        public static " + t.ClasseDao + " get" + t.ClasseDao + "()");
                            arquivo.WriteLine("        {");
                            arquivo.WriteLine("            if (" + t.ApelidoDao + " == null)");
                            arquivo.WriteLine("                " + t.ApelidoDao + " = new " + t.ClasseDao + "();");
                            arquivo.WriteLine("            return " + t.ApelidoDao + ";");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível criar os arquivos das tabelas.\n" + ex.Message);
            }
            return true;
        }
        bool CriarArquivos(string diretorio)
        {
            try
            {
                LimparDiretorio(diretorio);

                if (!Directory.Exists(diretorio))
                    Directory.CreateDirectory(diretorio);

                if (!Directory.Exists(diretorio + "\\model"))
                    Directory.CreateDirectory(diretorio + "\\model");

                if (!Directory.Exists(diretorio + "\\basemodel"))
                    Directory.CreateDirectory(diretorio + "\\basemodel");

                if (!Directory.Exists(diretorio + "\\provider"))
                    Directory.CreateDirectory(diretorio + "\\provider");

                if (!Directory.Exists(diretorio + "\\basedal"))
                    Directory.CreateDirectory(diretorio + "\\basedal");

                if (!Directory.Exists(diretorio + "\\dal"))
                    Directory.CreateDirectory(diretorio + "\\dal");

                if (!Directory.Exists(diretorio + "\\data"))
                    Directory.CreateDirectory(diretorio + "\\data");

                string comando = @"
                    SELECT *, 0 as ordenar
                       FROM INFORMATION_SCHEMA.`TABLES`
                      WHERE TABLE_SCHEMA = ?TABLE_NAME
                        AND TABLE_TYPE   = 'BASE TABLE';";
                MySqlParameter[] parms = new MySqlParameter[1];
                parms[0] = Accessor.Funcoes.CreateParameter("?TABLE_NAME", MySqlDbType.VarChar, cmbDatabase.Text);

                DataTable dtTablesOrigin = Accessor.Funcoes.FillDataTable(CommandType.Text, comando, parms);

                if (File.Exists(diretorio + "\\indice.txt"))
                    File.Delete(diretorio + "\\indice.txt");

                using (File.Create(diretorio + "\\indice.txt")) { }

                int quantidadeInicio = 4;
                int quantidadeTabelas = 0;
                int quantidadeInserts = 3;
                int quantidadeAtualiza = 20;
                int quantidadeConfigModuloProcedures = 3;
                int totalBarraProgress = 0;

                List<TabelaInfo> tabelas = new List<TabelaInfo>();

                foreach (DataRow r in dtTablesOrigin.Rows)
                {
                    string nomeTabela = r["table_name"].ToString().ToLower();

                    TabelaInfo tabela = new TabelaInfo();
                    tabela.Descricao = nomeTabela;

                    tabelas.Add(tabela);

                    string recoverSelectColumn = @"
                        SELECT *, if (column_key = 'PRI', '9999', '') as ordernarKey
                           FROM INFORMATION_SCHEMA.`COLUMNS`
                          WHERE TABLE_NAME   = ?TABLE_NAME
                            AND TABLE_SCHEMA = ?TABLE_SCHEMA
                         ORDER BY ordernarKey desc, ORDINAL_POSITION;";

                    parms = new MySqlParameter[2];
                    parms[0] = Accessor.Funcoes.CreateParameter("?TABLE_NAME", MySqlDbType.VarChar, nomeTabela);
                    parms[1] = Accessor.Funcoes.CreateParameter("?TABLE_SCHEMA", MySqlDbType.VarChar, cmbDatabase.Text);

                    StringBuilder _columns = new StringBuilder();
                    List<string> primaryKeys = new List<string>();

                    ColunaInfo coluna = null;
                    using (MySqlDataReader rdr = Accessor.Funcoes.ExecuteReader(CommandType.Text, recoverSelectColumn, parms))
                    {
                        while (rdr.Read())
                        {
                            coluna = new ColunaInfo();
                            coluna.Descricao = rdr["column_name"].ToString();
                            coluna.Tipo = rdr["column_type"].ToString();
                            coluna.Default = rdr["column_default"].ToString();
                            coluna.Comentario = rdr["column_comment"].ToString();
                            coluna.ChavePrimaria = rdr["column_key"].ToString().ToLower().Contains("pri");
                            coluna.AceitaNulo = rdr["is_nullable"].ToString().ToLower().Contains("yes");
                            coluna.AutoIncremento = rdr["extra"].ToString().ToLower().Contains("auto_increment");
                            coluna.Index = rdr["column_key"].ToString().ToLower().Contains("mul");

                            tabela.colunas.Add(coluna);

                            if (rdr["column_key"].ToString().ToLower().Contains("pri"))
                                primaryKeys.Add(rdr["column_name"].ToString());
                        }
                    }

                    using (TextWriter arquivoIndice = File.AppendText(diretorio + "\\indice.txt"))
                    {
                        arquivoIndice.WriteLine("");
                        quantidadeTabelas++;
                        arquivoIndice.Flush();
                        arquivoIndice.Close();
                    }

                    #region CriaArquivo Base Model
                    File.Create(diretorio + "\\basemodel\\Base" + tabela.ArquivoModel).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\basemodel\\Base" + tabela.ArquivoModel))
                    {
                        bool existeLazyLoading = (tabela.colunas.Find(p => p.Descricao != "id" && p.Descricao.EndsWith("_id")) != null);
                        bool existeComment = (tabela.colunas.Find(p => !string.IsNullOrEmpty(p.Comentario)) != null);

                        arquivo.WriteLine("package " + txtPacote.Text + ".model;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import android.content.ContentValues;");
                        arquivo.WriteLine("import android.content.Context;");
                        arquivo.WriteLine("import android.database.Cursor;");

                        if (existeComment)
                        {
                            arquivo.WriteLine("");
                            arquivo.WriteLine("import com.google.gson.annotations.SerializedName;");
                        }

                        arquivo.WriteLine("");
                        arquivo.WriteLine("import java.io.Serializable;");
                        arquivo.WriteLine("import java.util.Date;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import " + txtPacote.Text + ".dal.DAOFactory;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("public abstract class Base" + tabela.Classe + " extends BaseObject {");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public static final String TABLE_NAME = \"" + tabela.Descricao + "\";");
                        arquivo.WriteLine("");

                        // Cria variaveis privadas
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            if (!c.ObjetoBase)
                            {
                                if (!string.IsNullOrEmpty(c.Comentario) && c.Comentario != "notjson")
                                    arquivo.WriteLine("    @SerializedName(\"" + c.Comentario + "\")");

                                arquivo.WriteLine("    private " + c.TipoVariavel.ToString() + " " + c.Descricao + ";");
                            }
                        }

                        // Cria variaveis de classes relacionais
                        if (existeLazyLoading)
                        {
                            arquivo.WriteLine("");
                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                if (!string.IsNullOrEmpty(c.ClasseRelacional))
                                {
                                    if (existeComment)
                                        arquivo.WriteLine("    @SerializedName(\"" + c.ClasseRelacionalApelido + "Info\")");

                                    arquivo.WriteLine("    private " + c.ClasseRelacional + " " + c.ClasseRelacionalApelido + ";");
                                }
                            }
                        }

                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public Base" + tabela.Classe + "(Base" + tabela.Classe + " t) {");
                        arquivo.WriteLine("        super();");

                        // Cria variaveis no construtor da classe
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            arquivo.WriteLine("        this." + c.Descricao + " = t." + c.Descricao + ";");
                        }

                        // Cria variaveis de classes relacionais no construtor da classe
                        if (existeLazyLoading)
                        {
                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                if (!string.IsNullOrEmpty(c.ClasseRelacional))
                                    arquivo.WriteLine("        this." + c.ClasseRelacionalApelido + " = t." + c.ClasseRelacionalApelido + ";");

                            }
                        }

                        arquivo.WriteLine("   }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public Base" + tabela.Classe + "() {");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");

                        // Cria get e set
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            if (!c.ObjetoBase)
                            {
                                arquivo.WriteLine("    public " + c.TipoVariavel.ToString() + " " + c.DescricaoGet + "() {");
                                arquivo.WriteLine("        return " + c.Descricao + ";");
                                arquivo.WriteLine("    }");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("    public void " + c.DescricaosSet + "(" + c.TipoVariavel.ToString() + " " + c.Descricao + ") {");
                                arquivo.WriteLine("        this." + c.Descricao + " = " + c.Descricao + ";");
                                arquivo.WriteLine("    }");
                                arquivo.WriteLine("");
                            }
                        }

                        // Cria get do lazy loading
                        if (existeLazyLoading)
                        {
                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                if (!string.IsNullOrEmpty(c.ClasseRelacional))
                                {
                                    arquivo.WriteLine("    public void set" + c.ClasseRelacional + "(" + c.ClasseRelacional + " " + c.ClasseRelacionalApelido + ") {");
                                    arquivo.WriteLine("        this." + c.ClasseRelacionalApelido + " = " + c.ClasseRelacionalApelido + ";");
                                    arquivo.WriteLine("    }");
                                    arquivo.WriteLine("");
                                    arquivo.WriteLine("    public " + c.ClasseRelacional + " get" + c.ClasseRelacional + "() {");
                                    arquivo.WriteLine("        return " + c.ClasseRelacionalApelido + ";");
                                    arquivo.WriteLine("    }");
                                    arquivo.WriteLine("");
                                }
                            }
                        }

                        arquivo.WriteLine("    public ContentValues values() {");
                        arquivo.WriteLine("        ContentValues values = new ContentValues();");

                        // Cria content values
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            if (!c.TipoVariavel.Equals(TipoVariavelEnum.Date))
                            {
                                if (!c.Descricao.Equals("id"))
                                {
                                    arquivo.WriteLine("        if (" + c.Descricao + " != null) {");
                                    arquivo.WriteLine("            values.put(Columns." + c.DescricaoReferencia + ", " + c.Descricao + ");");
                                    arquivo.WriteLine("        }");
                                }
                            }
                            else
                            {
                                switch (c.Descricao)
                                {
                                    case "datahora_criacao":
                                        arquivo.WriteLine("        if (datahora_criacao == null) {");
                                        arquivo.WriteLine("            datahora_criacao = new Date(System.currentTimeMillis());");
                                        arquivo.WriteLine("        }");
                                        arquivo.WriteLine("");
                                        arquivo.WriteLine("        values.put(Columns.DATAHORA_CRIACAO, datahora_criacao.getTime());");
                                        break;

                                    case "datahora_alteracao":
                                        arquivo.WriteLine("        if (id != null) {");
                                        arquivo.WriteLine("            datahora_alteracao = new Date(System.currentTimeMillis());");
                                        arquivo.WriteLine("        }");
                                        arquivo.WriteLine("");
                                        arquivo.WriteLine("        if (datahora_alteracao != null) {");
                                        arquivo.WriteLine("            values.put(Columns.DATAHORA_ALTERACAO, datahora_alteracao.getTime());");
                                        arquivo.WriteLine("        }");
                                        break;

                                    default:
                                        arquivo.WriteLine("        if (" + c.Descricao + " != null) {");
                                        arquivo.WriteLine("            values.put(Columns." + c.DescricaoReferencia + ", " + c.Descricao + ".getTime());");
                                        arquivo.WriteLine("        }");
                                        break;
                                }
                            }

                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("        return values;");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    protected void loadFromCursor(Cursor c, boolean lazyLoading, Context context) {");
                        arquivo.WriteLine("        clear();");
                        arquivo.WriteLine("");

                        // Cria load do cursor
                        bool primeiroLoop = true;
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            arquivo.WriteLine("        " + (primeiroLoop ? "int " : "") + "index = c.getColumnIndex(Columns." + c.DescricaoReferencia + ");");
                            arquivo.WriteLine("        if (index > -1 && !c.isNull(index)) {");

                            if (c.TipoVariavel.Equals(TipoVariavelEnum.Integer))
                                arquivo.WriteLine("            " + c.DescricaosSet + "(c.getInt(index));");
                            else if (c.TipoVariavel.Equals(TipoVariavelEnum.Date))
                                arquivo.WriteLine("            " + c.DescricaosSet + "(new Date((c.getLong(index))));");
                            else if (c.TipoVariavel.Equals(TipoVariavelEnum.Boolean))
                                arquivo.WriteLine("            " + c.DescricaosSet + "(c.getString(index).contains(\"1\"));");
                            else
                                arquivo.WriteLine("            " + c.DescricaosSet + "(c.get" + c.TipoVariavel.ToString() + "(index));");

                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("");

                            primeiroLoop = false;
                        }

                        if (existeLazyLoading)
                        {
                            arquivo.WriteLine("        if (lazyLoading)");
                            arquivo.WriteLine("            lazyLoading(context);");
                        }

                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    protected void clear() {");

                        // Cria metodo clear
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            arquivo.WriteLine("        " + c.DescricaosSet + "(null);");
                        }

                        // Cria clear dos lazy loading
                        if (existeLazyLoading)
                        {
                            foreach (ColunaInfo c in tabela.colunas)
                                if (!string.IsNullOrEmpty(c.ClasseRelacional))
                                    arquivo.WriteLine("        " + c.ClasseRelacionalApelido + " = null;");
                        }

                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");

                        // Cria método lazy loading
                        if (existeLazyLoading)
                        {
                            arquivo.WriteLine("    protected void lazyLoading(Context context) {");

                            foreach (ColunaInfo c in tabela.colunas)
                            {
                                if (!string.IsNullOrEmpty(c.ClasseRelacional))
                                {
                                    arquivo.WriteLine("        if (" + c.Descricao + " != null)");
                                    arquivo.WriteLine("            " + c.ClasseRelacionalApelido + " = DAOFactory.get" + c.ClasseRelacional + "DAO(context).get" + c.ClasseRelacional + "ById(" + c.Descricao + ");");
                                    arquivo.WriteLine("");
                                }
                            }

                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("    public static final class Columns {");

                        // Cria referencia Columns
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            arquivo.WriteLine("        public static final String " + c.DescricaoReferencia + " = \"" + c.DescricaoDB + "\";");
                        }

                        arquivo.WriteLine("    }");

                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public static final class FullColumns {");

                        // Cria referencia Columns
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            arquivo.WriteLine("        public static final String " + c.DescricaoReferencia + " = TABLE_NAME + \".\" + Columns." + c.DescricaoReferencia + ";");
                        }

                        arquivo.WriteLine("    }");

                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public static final class Aliases {");

                        // Cria referencia Columns
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            arquivo.WriteLine("        public static final String " + c.DescricaoReferencia + " = TABLE_NAME + \"_\" + Columns." + c.DescricaoReferencia + ";");
                        }

                        arquivo.WriteLine("    }");

                        arquivo.WriteLine("");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo Model
                    File.Create(diretorio + "\\model\\" + tabela.ArquivoModel).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\model\\" + tabela.ArquivoModel))
                    {
                        bool existeLazyLoading = (tabela.colunas.Find(p => p.Descricao != "id" && p.Descricao.EndsWith("_id")) != null);

                        arquivo.WriteLine("package " + txtPacote.Text + ".model;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import android.content.Context;");
                        arquivo.WriteLine("import android.database.Cursor;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import " + txtPacote.Text + ".basemodel.Base" + tabela.Classe + ";");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("public class " + tabela.Classe + " extends Base" + tabela.Classe + " {");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public void loadFromCursor(Cursor c) {");
                        arquivo.WriteLine("        loadFromCursor(c, false, null);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public void loadFromCursor(Cursor c, boolean lazyLoading, Context context) {");
                        arquivo.WriteLine("        super.loadFromCursor(c, lazyLoading, context);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public void clear() {");
                        arquivo.WriteLine("        super.clear();");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");

                        if (existeLazyLoading)
                        {
                            arquivo.WriteLine("    public void lazyLoading(Context context) {");
                            arquivo.WriteLine("        super.lazyLoading(context);");
                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo Handler
                    File.Create(diretorio + "\\provider\\" + tabela.ArquivoHandler).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\provider\\" + tabela.ArquivoHandler))
                    {
                        arquivo.WriteLine("package " + txtPacote.Text + ".provider;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import android.content.ContentUris;");
                        arquivo.WriteLine("import android.content.ContentValues;");
                        arquivo.WriteLine("import android.content.Context;");
                        arquivo.WriteLine("import android.database.Cursor;");
                        arquivo.WriteLine("import android.net.Uri;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import " + txtPacote.Text + ".model." + tabela.Classe + ";");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("public class " + tabela.Classe + "Handler extends DataHandler {");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    protected " + tabela.Classe + "Handler(Context context) {");
                        arquivo.WriteLine("        super(context);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public Cursor query(int code, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {");
                        arquivo.WriteLine("        String[] columns = {");

                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            arquivo.WriteLine("                " + tabela.Classe + ".FullColumns." + c.DescricaoReferencia + ",");
                        }

                        arquivo.WriteLine("        };");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        if (code == DataProvider." + tabela.ProviderCODE + ") {");
                        arquivo.WriteLine("            return db().query(" + tabela.Classe + ".TABLE_NAME, projection != null ? projection : columns, selection, selectionArgs, null, null, (sortOrder != null ? sortOrder : " + DefineOrdenacao(tabela) + "));");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        } else if (code == DataProvider." + tabela.ProviderRAW + ") {");
                        arquivo.WriteLine("            return db().rawQuery(selection, selectionArgs);");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        } else {");
                        arquivo.WriteLine("            long id = ContentUris.parseId(uri);");
                        arquivo.WriteLine("            return db().query(" + tabela.Classe + ".TABLE_NAME, projection != null ? projection : columns, " + tabela.Classe + ".Columns._ID + \" = ? \", new String[]{String.valueOf(id)}, null, null, " + tabela.Classe + ".Columns._ID);");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public Cursor rawQuery(String selection, String[] selectionArgs) {");
                        arquivo.WriteLine("        return db().rawQuery(selection, selectionArgs);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public Uri insert(int code, Uri uri, ContentValues values) {");
                        arquivo.WriteLine("        if (code == DataProvider." + tabela.ProviderID + " || code == DataProvider." + tabela.ProviderRAW + ") {");
                        arquivo.WriteLine("            throw new InvalidURIException(uri);");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        long id = db().insert(" + tabela.Classe + ".TABLE_NAME, null, values);");
                        arquivo.WriteLine("        return ContentUris.withAppendedId(uri, id);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public int update(int code, Uri uri, ContentValues values, String selection, String[] selectionArgs) {");
                        arquivo.WriteLine("        if (code == DataProvider." + tabela.ProviderCODE + " || code == DataProvider." + tabela.ProviderRAW + ") {");
                        arquivo.WriteLine("            throw new InvalidURIException(uri);");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        long id = ContentUris.parseId(uri);");
                        arquivo.WriteLine("        return db().update(" + tabela.Classe + ".TABLE_NAME, values, " + tabela.Classe + ".Columns._ID + \" = ? \", new String[]{String.valueOf(id)});");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public int delete(int code, Uri uri, String selection, String[] selectionArgs) {");
                        arquivo.WriteLine("        if (code == DataProvider." + tabela.ProviderCODE + " || code == DataProvider." + tabela.ProviderRAW + ") {");
                        arquivo.WriteLine("            throw new InvalidURIException(uri);");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        long id = ContentUris.parseId(uri);");
                        arquivo.WriteLine("        return db().delete(" + tabela.Classe + ".TABLE_NAME, " + tabela.Classe + ".Columns._ID + \" = ? \", new String[]{String.valueOf(id)});");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo Base DAO
                    File.Create(diretorio + "\\basedal\\Base" + tabela.ArquivoDAO).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\basedal\\Base" + tabela.ArquivoDAO))
                    {
                        arquivo.WriteLine("package " + txtPacote.Text + ".basedal;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import android.content.ContentUris;");
                        arquivo.WriteLine(chkVersaoSuporte.Checked ? "import android.support.v4.content.CursorLoader;" : "import android.content.CursorLoader;");
                        arquivo.WriteLine("import android.database.Cursor;");
                        arquivo.WriteLine("import android.net.Uri;");
                        arquivo.WriteLine("import android.os.Bundle;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import java.util.ArrayList;");
                        arquivo.WriteLine("import java.util.List;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import " + txtPacote.Text + ".dal.DAO;");
                        arquivo.WriteLine("import " + txtPacote.Text + ".model." + tabela.Classe + ";");
                        arquivo.WriteLine("import " + txtPacote.Text + ".provider.DataProvider;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("public abstract class Base" + tabela.Classe + "DAO extends DAO {");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public Base" + tabela.Classe + "DAO() {");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public boolean salvar(" + tabela.Classe + " " + tabela.Apelido + ") {");
                        arquivo.WriteLine("        return " + tabela.Apelido + ".getId() != null && " + tabela.Apelido + ".getId() > 0");
                        arquivo.WriteLine("                ? update(" + tabela.Apelido + ")");
                        arquivo.WriteLine("                : insert(" + tabela.Apelido + ");");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    private boolean insert(" + tabela.Classe + " " + tabela.Apelido + ") {");
                        arquivo.WriteLine("        Uri newUri = contentResolver().insert(DataProvider." + tabela.CONTENT_URI + ", " + tabela.Apelido + ".values()); ");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        long id = ContentUris.parseId(newUri);");
                        arquivo.WriteLine("        " + tabela.Apelido + ".setId(id);");
                        arquivo.WriteLine("        return id > 0;");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    private boolean update(" + tabela.Classe + " " + tabela.Apelido + ") {");
                        arquivo.WriteLine("        Uri uri = ContentUris.withAppendedId(DataProvider." + tabela.CONTENT_URI + ", " + tabela.Apelido + ".getId());");
                        arquivo.WriteLine("        return contentResolver().update(uri, " + tabela.Apelido + ".values(), null, null) > 0;");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public int delete(" + tabela.Classe + " " + tabela.Apelido + ") {");
                        arquivo.WriteLine("        Uri uri = ContentUris.withAppendedId(DataProvider." + tabela.CONTENT_URI + ", " + tabela.Apelido + ".getId());");
                        arquivo.WriteLine("        return contentResolver().delete(uri, null, null);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public void deleteAll() {");
                        arquivo.WriteLine("        rawQuery(DataProvider." + tabela.CONTENT_URI_RAW + ", \"DELETE FROM \" + " + tabela.Classe + ".TABLE_NAME, null);");
                        arquivo.WriteLine("        rawQuery(DataProvider." + tabela.CONTENT_URI_RAW + ", \"UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = '\" + " + tabela.Classe + ".TABLE_NAME + \"'\", null);");
                        arquivo.WriteLine("        rawQuery(DataProvider." + tabela.CONTENT_URI_RAW + ", \"VACUUM\", null);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public " + tabela.Classe + " get" + tabela.Classe + "ById(long id, boolean... lazyLoading) {");
                        arquivo.WriteLine("        " + tabela.Classe + " " + tabela.Apelido + " = new " + tabela.Classe + "();");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        Cursor c = get" + tabela.Classe + "ByIdLoader(id).loadInBackground();");
                        arquivo.WriteLine("        try {");
                        arquivo.WriteLine("            if (c != null && c.moveToFirst())");
                        arquivo.WriteLine("                " + tabela.Apelido + ".loadFromCursor(c, lazyLoading.length > 0 && lazyLoading[0], context());");
                        arquivo.WriteLine("        } finally {");
                        arquivo.WriteLine("            if (c != null)");
                        arquivo.WriteLine("                c.close();");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("        return " + tabela.Apelido + ";");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");

                        string parametroLazyLoading = string.Empty;
                        string variavelLazyLoading = string.Empty;

                        List<ColunaInfo> joins = new List<ColunaInfo>();
                        foreach (ColunaInfo c in tabela.colunas)
                        {
                            bool lista = false;
                            bool join = false;

                            if (CriarSelect(c.Descricao, ref lista, ref join))
                            {
                                if (join)
                                {
                                    joins.Add(c);

                                    parametroLazyLoading = ", boolean... lazyLoading";
                                    variavelLazyLoading = ", lazyLoading.length > 0 && lazyLoading[0], context()";
                                }

                                string variavel = c.TipoVariavel.ToString().StartsWith("S") ? c.TipoVariavel.ToString() : c.TipoVariavel.ToString().ToLower();

                                if (variavel.Equals("integer"))
                                    variavel = "int";

                                string pesquisaPor = "Por" + c.DescricaoGet.Substring(3);

                                if (!lista)
                                {
                                    arquivo.WriteLine("    public " + tabela.Classe + " get" + tabela.Classe + pesquisaPor + "(" + variavel + " " + c.Descricao + parametroLazyLoading + ") {");
                                    arquivo.WriteLine("        " + tabela.Classe + " " + tabela.Apelido + " = new " + tabela.Classe + "();");
                                    arquivo.WriteLine("");
                                    arquivo.WriteLine("        Cursor c = get" + tabela.Classe + pesquisaPor + "Cursor(" + c.Descricao + ");");
                                    arquivo.WriteLine("        try {");
                                    arquivo.WriteLine("            if (c != null && c.moveToFirst())");
                                    arquivo.WriteLine("                " + tabela.Apelido + ".loadFromCursor(c" + variavelLazyLoading + ");");
                                    arquivo.WriteLine("        } finally {");
                                    arquivo.WriteLine("            if (c != null)");
                                    arquivo.WriteLine("                c.close();");
                                    arquivo.WriteLine("        }");
                                    arquivo.WriteLine("        return " + tabela.Apelido + ";");
                                    arquivo.WriteLine("    }");
                                    arquivo.WriteLine("");
                                }
                                else
                                {
                                    arquivo.WriteLine("    public List<" + tabela.Classe + "> get" + tabela.ClassePlural + pesquisaPor + "List(" + variavel + " " + c.Descricao + parametroLazyLoading + ") {");
                                    arquivo.WriteLine("");
                                    arquivo.WriteLine("        List<" + tabela.Classe + "> " + tabela.ApelidoPlural + " = new ArrayList<>();");
                                    arquivo.WriteLine("");
                                    arquivo.WriteLine("        Cursor c = get" + tabela.ClassePlural + pesquisaPor + "Cursor(" + c.Descricao + ");");
                                    arquivo.WriteLine("        try {");
                                    arquivo.WriteLine("            if (c != null && c.moveToFirst()) {");
                                    arquivo.WriteLine("                do {");
                                    arquivo.WriteLine("                    " + tabela.Classe + " t = new " + tabela.Classe + "();");
                                    arquivo.WriteLine("                    t.loadFromCursor(c" + variavelLazyLoading + ");");
                                    arquivo.WriteLine("                    " + tabela.ApelidoPlural + ".add(t);");
                                    arquivo.WriteLine("                } while (c.moveToNext());");
                                    arquivo.WriteLine("            }");
                                    arquivo.WriteLine("        } finally {");
                                    arquivo.WriteLine("            if (c != null)");
                                    arquivo.WriteLine("                c.close();");
                                    arquivo.WriteLine("        }");
                                    arquivo.WriteLine("        return " + tabela.ApelidoPlural + ";");
                                    arquivo.WriteLine("    }");
                                    arquivo.WriteLine("");
                                }

                                arquivo.WriteLine("    public Cursor get" + (lista ? tabela.ClassePlural : tabela.Classe) + pesquisaPor + "Cursor(" + variavel + " " + c.Descricao + ") {");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        String selection = " + tabela.Classe + ".FullColumns." + c.DescricaoReferencia + " + \" = ? \";");
                                arquivo.WriteLine("        String[] selectionArgs = {String.valueOf(" + c.Descricao + ")};");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        return contentResolver().query(DataProvider." + tabela.CONTENT_URI + ", null, selection, selectionArgs, null);");
                                arquivo.WriteLine("    }");
                                arquivo.WriteLine("");

                                arquivo.WriteLine("    public CursorLoader get" + (lista ? tabela.ClassePlural : tabela.Classe) + pesquisaPor + "Loader(" + variavel + " " + c.Descricao + ") {");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        String selection = " + tabela.Classe + ".FullColumns." + c.DescricaoReferencia + " + \" = ? \";");
                                arquivo.WriteLine("        String[] selectionArgs = {String.valueOf(" + c.Descricao + ")};");
                                arquivo.WriteLine("");
                                arquivo.WriteLine("        return new CursorLoader(context(), DataProvider." + tabela.CONTENT_URI + ", null, selection, selectionArgs, null);");
                                arquivo.WriteLine("    }");
                                arquivo.WriteLine("");
                            }
                        }

                        if (joins.Count > 1)
                        {
                            StringBuilder parametros = new StringBuilder();
                            StringBuilder parametrosPassar = new StringBuilder();
                            StringBuilder selection = new StringBuilder();
                            StringBuilder selectionArgs = new StringBuilder();

                            foreach (ColunaInfo c in joins)
                            {
                                string variavel = c.TipoVariavel.ToString().StartsWith("S") ? c.TipoVariavel.ToString() : c.TipoVariavel.ToString().ToLower();

                                parametros.Append(variavel + " " + c.Descricao + ", ");

                                parametrosPassar.Append(c.Descricao + ", ");

                                selection.Append(tabela.Classe + ".FullColumns." + c.DescricaoReferencia + " + \" = ? AND \" + ");

                                selectionArgs.Append("String.valueOf(" + c.Descricao + "), ");
                            }

                            arquivo.WriteLine("    public List<" + tabela.Classe + "> get" + tabela.ClassePlural + "PorParametrosList(" + parametros.ToString().Remove(parametros.Length - 2, 2) + parametroLazyLoading + ") {");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        List<" + tabela.Classe + "> " + tabela.ApelidoPlural + " = new ArrayList<>();");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        Cursor c = get" + tabela.ClassePlural + "PorParametros(" + parametrosPassar.ToString().Remove(parametrosPassar.Length - 2, 2) + ");");
                            arquivo.WriteLine("        try {");
                            arquivo.WriteLine("            if (c != null && c.moveToFirst()) {");
                            arquivo.WriteLine("                do {");
                            arquivo.WriteLine("                    " + tabela.Classe + " t = new " + tabela.Classe + "();");
                            arquivo.WriteLine("                    t.loadFromCursor(c" + variavelLazyLoading + ");");
                            arquivo.WriteLine("                    " + tabela.ApelidoPlural + ".add(t);");
                            arquivo.WriteLine("                } while (c.moveToNext());");
                            arquivo.WriteLine("            }");
                            arquivo.WriteLine("        } finally {");
                            arquivo.WriteLine("            if (c != null)");
                            arquivo.WriteLine("                c.close();");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("        return " + tabela.ApelidoPlural + ";");
                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("    public Cursor get" + tabela.ClassePlural + "PorParametros(" + parametros.ToString().Remove(parametros.Length - 2, 2) + ") {");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        String selection = " + selection.ToString().Remove(selection.Length - 8, 8) + "\";");
                            arquivo.WriteLine("        String[] selectionArgs = {" + selectionArgs.ToString().Remove(selectionArgs.Length - 2, 2) + "};");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        return contentResolver().query(DataProvider." + tabela.CONTENT_URI + ", null, selection, selectionArgs, null);");
                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("    public CursorLoader get" + tabela.ClassePlural + "PorParametrosLoader(" + parametros.ToString().Remove(parametros.Length - 2, 2) + ") {");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        String selection = " + selection.ToString().Remove(selection.Length - 8, 8) + "\";");
                            arquivo.WriteLine("        String[] selectionArgs = {" + selectionArgs.ToString().Remove(selectionArgs.Length - 2, 2) + "};");
                            arquivo.WriteLine("");
                            arquivo.WriteLine("        return new CursorLoader(context(), DataProvider." + tabela.CONTENT_URI + ", null, selection, selectionArgs, null);");
                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("    public List<" + tabela.Classe + "> get" + tabela.ClassePlural + "List(" + (parametroLazyLoading.Length > 0 ? parametroLazyLoading.Substring(2) : "") + ") {");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        List<" + tabela.Classe + "> " + tabela.ApelidoPlural + " = new ArrayList<>();");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        Cursor c = get" + tabela.ClassePlural + "();");
                        arquivo.WriteLine("        try {");
                        arquivo.WriteLine("            if (c != null && c.moveToFirst()) {");
                        arquivo.WriteLine("                do {");
                        arquivo.WriteLine("                    " + tabela.Classe + " t = new " + tabela.Classe + "();");
                        arquivo.WriteLine("                    t.loadFromCursor(c" + variavelLazyLoading + ");");
                        arquivo.WriteLine("                    " + tabela.ApelidoPlural + ".add(t);");
                        arquivo.WriteLine("                } while (c.moveToNext());");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("        } finally {");
                        arquivo.WriteLine("            if (c != null)");
                        arquivo.WriteLine("                c.close();");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("        return " + tabela.ApelidoPlural + ";");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public Cursor get" + tabela.ClassePlural + "() {");
                        arquivo.WriteLine("        return contentResolver().query(DataProvider." + tabela.CONTENT_URI + ", null, null, null, null);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public CursorLoader get" + tabela.ClassePlural + "Loader() {");
                        arquivo.WriteLine("        return new CursorLoader(context(), DataProvider." + tabela.CONTENT_URI + ", null, null, null, null);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public CursorLoader get" + tabela.ClassePlural + "Loader(Bundle args) {");
                        arquivo.WriteLine("        String selection = null;");
                        arquivo.WriteLine("        String[] selectionArgs = null;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        String orderBy = null;");
                        arquivo.WriteLine("        if (args != null) {");
                        arquivo.WriteLine("            orderBy = args.getString(\"orderBy\");");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("            if (args.getString(\"where\") != null) {");
                        arquivo.WriteLine("                selection = args.getString(\"where\");");
                        arquivo.WriteLine("                selectionArgs = args.getStringArray(\"whereArray\");");
                        arquivo.WriteLine("            }");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("        return new CursorLoader(context(), DataProvider." + tabela.CONTENT_URI + ", null, selection, selectionArgs, orderBy);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public CursorLoader get" + tabela.Classe + "ByIdLoader(long id) {");
                        arquivo.WriteLine("        Uri uri = ContentUris.withAppendedId(DataProvider." + tabela.CONTENT_URI + ", id);");
                        arquivo.WriteLine("        return new CursorLoader(context(), uri, null, null, null, null);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    public void notify" + tabela.Classe + "() {");
                        arquivo.WriteLine("        contentResolver().notifyChange(DataProvider." + tabela.CONTENT_URI + ", null, true);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo DAO
                    File.Create(diretorio + "\\dal\\" + tabela.ArquivoDAO).Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\dal\\" + tabela.ArquivoDAO))
                    {
                        arquivo.WriteLine("package " + txtPacote.Text + ".dal;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import " + txtPacote.Text + ".basedal.Base" + tabela.Classe + "DAO;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("public class " + tabela.Classe + "DAO extends Base" + tabela.Classe + "DAO {");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion
                }

                if (tabelas.Count > 0)
                {
                    #region CriaArquivo BaseObject
                    File.Create(diretorio + "\\basemodel\\BaseObject.java").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\basemodel\\BaseObject.java"))
                    {
                        arquivo.Write(Library.ArquivoBaseObjects.RetornaTextoArquivo(txtPacote.Text));

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo DBHelper
                    File.Create(diretorio + "\\data\\DBHelper.java").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\data\\DBHelper.java"))
                    {
                        arquivo.Write(Library.ArquivoDBHelper.RetornaTextoArquivo(txtPacote.Text));

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo DAO Main
                    File.Create(diretorio + "\\dal\\DAO.java").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\dal\\DAO.java"))
                    {
                        arquivo.Write(Library.ArquivoDAO.RetornaTextoArquivo(txtPacote.Text));

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo DAO
                    File.Create(diretorio + "\\dal\\DAOFactory.java").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\dal\\DAOFactory.java"))
                    {
                        arquivo.WriteLine("package " + txtPacote.Text + ".dal;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import android.content.Context;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("public class DAOFactory {");
                        arquivo.WriteLine("");

                        foreach (TabelaInfo t in tabelas)
                        {
                            arquivo.WriteLine("    private static " + t.Classe + "DAO " + t.Apelido + "DAO;");
                        }

                        arquivo.WriteLine("");

                        foreach (TabelaInfo t in tabelas)
                        {
                            arquivo.WriteLine("    public static " + t.Classe + "DAO get" + t.Classe + "DAO(Context context) {");
                            arquivo.WriteLine("        if (" + t.Apelido + "DAO == null) {");
                            arquivo.WriteLine("            " + t.Apelido + "DAO = new " + t.Classe + "DAO();");
                            arquivo.WriteLine("            " + t.Apelido + "DAO.init(context.getApplicationContext());");
                            arquivo.WriteLine("        }");
                            arquivo.WriteLine("        return " + t.Apelido + "DAO;");
                            arquivo.WriteLine("    }");
                            arquivo.WriteLine("");
                        }

                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo DataHandler
                    File.Create(diretorio + "\\provider\\DataHandler.java").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\provider\\DataHandler.java"))
                    {
                        arquivo.Write(Library.ArquivoDataHandler.RetornaTextoArquivo(txtPacote.Text));

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo InvalidURIException
                    File.Create(diretorio + "\\provider\\InvalidURIException.java").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\provider\\InvalidURIException.java"))
                    {
                        arquivo.Write(Library.ArquivoInvalidException.RetornaTextoArquivo(txtPacote.Text));

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion

                    #region CriaArquivo Provider
                    File.Create(diretorio + "\\provider\\DataProvider.java").Close();
                    using (TextWriter arquivo = File.AppendText(diretorio + "\\provider\\DataProvider.java"))
                    {
                        arquivo.WriteLine("package " + txtPacote.Text + ".provider;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("import android.content.ContentProvider;");
                        arquivo.WriteLine("import android.content.ContentValues;");
                        arquivo.WriteLine("import android.content.UriMatcher;");
                        arquivo.WriteLine("import android.database.Cursor;");
                        arquivo.WriteLine("import android.net.Uri;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("// Content provider para acessar o banco de dados SQLite");
                        arquivo.WriteLine("public class DataProvider extends ContentProvider {");
                        arquivo.WriteLine("");

                        int posicao = 0;
                        foreach (TabelaInfo t in tabelas)
                        {
                            arquivo.WriteLine("    static final int " + t.ProviderCODE + " = " + (++posicao).ToString() + ";");
                            arquivo.WriteLine("    static final int " + t.ProviderID + " = " + (++posicao).ToString() + ";");
                            arquivo.WriteLine("    static final int " + t.ProviderRAW + " = " + (++posicao).ToString() + ";");
                        }

                        arquivo.WriteLine("");
                        arquivo.WriteLine("    private static final String AUTHORITY = \"" + txtPacote.Text + ".provider.DataProvider\";");
                        arquivo.WriteLine("");

                        foreach (TabelaInfo t in tabelas)
                        {
                            arquivo.WriteLine("    public static final Uri " + t.CONTENT_URI + " = Uri.parse(\"content://\" + AUTHORITY + \"/" + t.Descricao + "\");");
                            arquivo.WriteLine("    public static final Uri " + t.CONTENT_URI_RAW + " = Uri.parse(\"content://\" + AUTHORITY + \"/" + t.Descricao + "_raw\");");
                        }

                        arquivo.WriteLine("");
                        arquivo.WriteLine("private UriMatcher matcher;");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    // Os handlers são usados para tratar requisições, de acordo com o padrão da URI utilizada");

                        foreach (TabelaInfo t in tabelas)
                        {
                            arquivo.WriteLine("    private DataHandler " + t.Apelido + "Handler;");
                        }

                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public boolean onCreate() {");
                        arquivo.WriteLine("        // Cria os handlers");

                        foreach (TabelaInfo t in tabelas)
                        {
                            arquivo.WriteLine("        " + t.Apelido + "Handler = new " + t.Classe + "Handler(getContext());");
                        }

                        arquivo.WriteLine("");
                        arquivo.WriteLine("        // Configura o URI matcher");
                        arquivo.WriteLine("        matcher = new UriMatcher(UriMatcher.NO_MATCH);");
                        arquivo.WriteLine("");

                        foreach (TabelaInfo t in tabelas)
                        {
                            arquivo.WriteLine("        matcher.addURI(AUTHORITY, \"" + t.Descricao + "\", " + t.ProviderCODE + ");");
                            arquivo.WriteLine("        matcher.addURI(AUTHORITY, \"" + t.Descricao + "/#\", " + t.ProviderID + ");");
                            arquivo.WriteLine("        matcher.addURI(AUTHORITY, \"" + t.Descricao + "_raw\", " + t.ProviderRAW + ");");
                        }

                        arquivo.WriteLine("");
                        arquivo.WriteLine("        return true;");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {");
                        arquivo.WriteLine("        int code = matcher.match(uri);");
                        arquivo.WriteLine("        DataHandler handler = getHandler(code);");
                        arquivo.WriteLine("        Cursor c = handler.query(code, uri, projection, selection, selectionArgs, sortOrder);");
                        arquivo.WriteLine("        handler.setNotificationUri(c, uri);");
                        arquivo.WriteLine("        return c;");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public Uri insert(Uri uri, ContentValues values) {");
                        arquivo.WriteLine("        int code = matcher.match(uri);");
                        arquivo.WriteLine("        DataHandler handler = getHandler(code);");
                        arquivo.WriteLine("        Uri newUri = handler.insert(code, uri, values);");
                        arquivo.WriteLine("        handler.notifyChange(newUri);");
                        arquivo.WriteLine("        return newUri;");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {");
                        arquivo.WriteLine("        int code = matcher.match(uri);");
                        arquivo.WriteLine("        DataHandler handler = getHandler(code);");
                        arquivo.WriteLine("        int count = handler.update(code, uri, values, selection, selectionArgs);");
                        arquivo.WriteLine("        handler.notifyChange(uri);");
                        arquivo.WriteLine("        return count;");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public int delete(Uri uri, String selection, String[] selectionArgs) {");
                        arquivo.WriteLine("        int code = matcher.match(uri);");
                        arquivo.WriteLine("        DataHandler handler = getHandler(code);");
                        arquivo.WriteLine("        int count = handler.delete(code, uri, selection, selectionArgs);");
                        arquivo.WriteLine("        handler.notifyChange(uri);");
                        arquivo.WriteLine("        return count;");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    @Override");
                        arquivo.WriteLine("    public String getType(Uri uri) {");
                        arquivo.WriteLine("        int code = matcher.match(uri);");
                        arquivo.WriteLine("");

                        int posicaoTabela = 0;
                        bool primeiraVezIf = true;
                        foreach (TabelaInfo t in tabelas)
                        {
                            posicaoTabela++;

                            arquivo.WriteLine("        " + (primeiraVezIf ? "if (" : "        || ") + "code == " + t.ProviderID + (posicaoTabela >= tabelas.Count ? ") {" : ""));

                            primeiraVezIf = false;
                        }
                        arquivo.WriteLine("            return \"vnd.android.cursor.item/vnd.br.com.imperiumsolucoes\";");
                        arquivo.WriteLine("");

                        posicaoTabela = 0;
                        primeiraVezIf = true;
                        foreach (TabelaInfo t in tabelas)
                        {
                            posicaoTabela++;

                            arquivo.WriteLine("        " + (primeiraVezIf ? "} else if (" : "        || ") + "code == " + t.ProviderCODE + " || code == " + t.ProviderRAW + (posicaoTabela >= tabelas.Count ? ") {" : ""));

                            primeiraVezIf = false;
                        }


                        arquivo.WriteLine("            return \"vnd.android.cursor.dir/vnd.br.com.imperiumsolucoes\";");
                        arquivo.WriteLine("        }");
                        arquivo.WriteLine("        throw new IllegalArgumentException(\"URI not supported: \" + uri);");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("");
                        arquivo.WriteLine("    private DataHandler getHandler(int code) {");

                        posicaoTabela = 0;
                        primeiraVezIf = true;
                        foreach (TabelaInfo t in tabelas)
                        {
                            posicaoTabela++;

                            arquivo.WriteLine("        " + (primeiraVezIf ? "if (" : "} else if (") + "code == " + t.ProviderCODE + " || code == " + t.ProviderID + " || code == " + t.ProviderRAW + ") {");
                            arquivo.WriteLine("            return " + t.Apelido + "Handler;");
                            arquivo.WriteLine("");

                            if (posicaoTabela >= tabelas.Count)
                                arquivo.WriteLine("        }");

                            primeiraVezIf = false;
                        }

                        arquivo.WriteLine("        return null;");
                        arquivo.WriteLine("    }");
                        arquivo.WriteLine("}");

                        arquivo.Flush();
                        arquivo.Close();
                    }
                    #endregion
                }

                using (TextWriter arquivoIndice = File.AppendText(diretorio + "\\indice.txt"))
                {
                    totalBarraProgress = quantidadeInicio + quantidadeTabelas + quantidadeInserts + quantidadeAtualiza + quantidadeConfigModuloProcedures + 1;

                    arquivoIndice.WriteLine("");
                    arquivoIndice.WriteLine("//Total Quantidade da Barra de Progress " + totalBarraProgress);
                    arquivoIndice.Flush();
                    arquivoIndice.Close();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível criar os arquivos das tabelas.\n" + ex.Message);
            }
            return true;
        }