예제 #1
0
        /// <summary>
        /// Gera o código de uma única tabela
        /// </summary>
        /// <param name="esquema">O esquema da tabela</param>
        /// <returns>O código da tabela gerado</returns>
        public string GerarCodigoTabela(EsquemaTabela esquema)
        {
            //Adiciona a primeira parte do código
            string codigo =
@"using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace ClassesBD
{
    /// <summary>
    /// Objeto que representa a tabela " + esquema.NomeTabela + @" no banco de dados. 
    /// Essa classe foi gerada automaticamente pelo gerador de ObjetosBD no dia " + DateTime.Now + @"
    /// </summary>
    public class ";
            codigo += esquema.NomeTabela + @" : ObjetoBD
    {
        // Colunas: ";
            codigo += PegarNomesColunas(esquema) + @"
"
            + GerarAtributosObjeto(esquema) +
@"
"
                + GerarObjetosPai(esquema) + GerarObjetosFilho(esquema);
            codigo += @"
        #region Configuracoes
        // O indice desse ObjetoBD no EsquemasObjBD
        public override int IndexTabela { get { return " + esquema.IndiceTabela + @"; } }

        /// <summary>
        /// Define o esquema de tabela usado por esse ObjetoBD
        /// </summary>
        internal static EsquemaTabela DefinirTabela()
        {
            EsquemaTabela esquema = new EsquemaTabela(" + "\"" + esquema.NomeTabela + "\"" + @");
            // Os campos desse
            esquema.Campos = new CampoBD[]
            {
";
            codigo += GerarCamposObjeto(esquema) +
@"            };
            esquema.IndexColunaPK = " + esquema.IndexColunaPK + @";
            esquema.IndiceTabela = " + esquema.IndiceTabela + @";

            return esquema;
        }
        #endregion
    }
}";
            return codigo;
        }
        public static EsquemaTabela[] PegarEsquemaTabelasColunas()
        {
            EsquemaTabela[] esquemaTabelas;
            System.Data.DataTable tabEsquemaColunas;
            CampoBD[] camposTabela;
            ControladorBD cBD = new ControladorBD();
            //Pega o esquema das tabelas no BD
            System.Data.DataTable tabEsquemaTabelas = cBD.PegarEsquemaTabelas();

            esquemaTabelas = new EsquemaTabela[tabEsquemaTabelas.Rows.Count];
            //Laço para pegar o esquema de cada tabela
            for (int i = 0; i < tabEsquemaTabelas.Rows.Count; i++)
            {
                //Define a tabela atual
                esquemaTabelas[i] = new EsquemaTabela(tabEsquemaTabelas.Rows[i][2].ToString());
                //Pega as colunas
                tabEsquemaColunas = cBD.PegarEsquemaColunas(esquemaTabelas[i].NomeTabela);
                camposTabela = new CampoBD[tabEsquemaColunas.Rows.Count];
                //Laço para definir cada coluna
                for (int j = 0; j < tabEsquemaColunas.Rows.Count; j++)
                {
                    string nome = tabEsquemaColunas.Rows[j][3].ToString();
                    bool permiteNulo;
                    if (tabEsquemaColunas.Rows[j][6].ToString() == "NO")
                        permiteNulo = false;
                    else
                    {
                        permiteNulo = true;
                    }
                    //Define os tipos
                    System.Data.SqlDbType tipoBD = (System.Data.SqlDbType)Enum.Parse(typeof(System.Data.SqlDbType),
                        tabEsquemaColunas.Rows[j][7].ToString(), true);
                    Type tipo = PegarTipoColuna(tipoBD);
                    //Define a quantidade de linhas
                    int maxLenght = 0;
                    if (tabEsquemaColunas.Rows[j][8].GetType() == typeof(int))
                        maxLenght = (int)tabEsquemaColunas.Rows[j][8];

                    camposTabela[j] = new CampoBD(
                         i,
                         nome,
                         permiteNulo,
                         tipoBD,
                         tipo,
                         maxLenght,
                         TipoCampo.Comum
                        );
                }
                esquemaTabelas[i].Campos = camposTabela;
            }
            return esquemaTabelas;
        }
예제 #3
0
 /// <summary>
 /// Declara o objeto e define seus campos já definindo o esquema de tabela enviado
 /// </summary>
 public RelacaoBD(string constraintName, int indexColunaFilha, int indexColunaPai, EsquemaTabela esquemaFilho, EsquemaTabela esquemaPai)
 {
     ConstraintName = constraintName;
     IndexColunaFilha = indexColunaFilha;
     IndexColunaPai = indexColunaPai;
     EsquemaPai = esquemaPai;
     EsquemaFilho = esquemaFilho;
     TabelaPai = esquemaPai.NomeTabela;
     TabelaFilha = esquemaFilho.NomeTabela;
     ColunaPai = esquemaPai.Campos[indexColunaPai].NomeCampo;
     ColunaFilha = esquemaFilho.Campos[indexColunaFilha].NomeCampo;
     IndexTabelaPai = esquemaPai.IndiceTabela;
     IndexTabelaFilha = esquemaFilho.IndiceTabela;
 }
 /// <summary>
 /// Verifica o esquema com todos os esquemas anteriores. Sempre que o esquema for
 /// pai de um esquema anterior, o esquema troca de lugar com o anterior.
 /// </summary>
 static bool VerificarMenoresEsquema(EsquemaTabela esquema, EsquemaTabela[] novoesquema)
 {
     bool inverteu = false;
     int indiceVerificado = esquema.IndiceTabela - 1;
     while (indiceVerificado >= 0)
     {
         if (VerificarSeEhPai(esquema, novoesquema[indiceVerificado]))
         {
             InverterIndices(esquema, novoesquema[indiceVerificado], novoesquema);
             inverteu = true;
         }
         indiceVerificado--;
     }
     return inverteu;
 }
 /// <summary>
 /// Verifica se o esquema pai é pai do filho por meio das relações
 /// </summary>
 static bool VerificarSeEhPai(EsquemaTabela pai, EsquemaTabela filho)
 {
     if (filho.RelacoesPai == null)
         return false;
     for (int i = 0; i < filho.RelacoesPai.Length; i++)
     {
         if (filho.RelacoesPai[i].EsquemaPai == pai)
             return true;
     }
     return false;
 }
        /// <summary>
        /// Define a hierarquia das tabelas e retorna um vetor reorganizado
        /// A classe EsquemasObjBD deve estar configurada
        /// </summary>
        public static EsquemaTabela[] DefinirHierarquia(EsquemaTabela[] esquemas, RelacaoBD[] relacoes)
        {
            //Determina os indices das tabelas nas relações
            foreach (var r in relacoes)
            {
                r.PegarIndicesTabelas();
            }

            //Determina os indices das tabelas nelas mesmas
            DeterminarIndicesTabelas(esquemas);
            //Define as relações nas tabelas
            DefinirRelacoesTabelas(esquemas, relacoes);

            EsquemaTabela[] novoEsquemas = new EsquemaTabela[esquemas.Length];
            for (int i = 0; i < esquemas.Length; i++)
            {
                novoEsquemas[i] = esquemas[i];
            }

            VerificarEsquemasMaiores(novoEsquemas);

            // Determina os indices das tabelas
            for (int i = 0; i < novoEsquemas.Length; i++)
            {
                EsquemasObjBD.EsquemasTabelas[i] = novoEsquemas[i];
            }

            // Redefine indices das tabelas nas relações
            foreach (var r in relacoes)
            {
                r.PegarIndicesTabelas();
                r.PegarIndicesColunas();
            }
            return EsquemasObjBD.EsquemasTabelas;
        }
 /// <summary>
 /// Faz toda a verificação para determinar a hierarquia das tabelas
 /// </summary>
 /// <param name="novoesquema"></param>
 static void VerificarEsquemasMaiores(EsquemaTabela[] novoesquema)
 {
     for (int i = novoesquema.Length-1; i >= 0; i--)
     {
         VerificarMenoresEsquema(novoesquema[i], novoesquema);
     }
 }
 /// <summary>
 /// Determina as relações nos objetos
 /// Deve ter determinado os indices das tabelas nas tabelas e nas relações
 /// </summary>
 public static void DefinirRelacoesTabelas(EsquemaTabela[] esquemas, RelacaoBD[] relacoes)
 {
     List<RelacaoBD> relacoesPai;
     List<RelacaoBD> relacoesFilho;
     foreach (var es in esquemas)
     {
         relacoesPai = new List<RelacaoBD>();
         relacoesFilho = new List<RelacaoBD>();
         for (int i = 0; i < relacoes.Length; i++)
         {
             if (relacoes[i].IndexTabelaPai == es.IndiceTabela)
             {
                 relacoesPai.Add(relacoes[i]);
             }
             if (relacoes[i].IndexTabelaFilha == es.IndiceTabela)
             {
                 relacoesFilho.Add(relacoes[i]);
             }
         }
         if (relacoesPai.Count > 0)
             es.RelacoesFilha = relacoesPai.ToArray();
         if (relacoesFilho.Count > 0)
             es.RelacoesPai = relacoesFilho.ToArray();
     }
 }
 /// <summary>
 /// Determina os indices das tabelas nelas
 /// </summary>
 public static void DeterminarIndicesTabelas(EsquemaTabela[] esquemas)
 {
     for (int i = 0; i < esquemas.Length; i++)
     {
         esquemas[i].IndiceTabela = i;
     }
 }
예제 #10
0
 /// <summary>
 /// Configura todos os esquemas das tabelas
 /// </summary>
 public static void ConfigurarEsquemas(EsquemaTabela[] esquemasTabelas, RelacaoBD[] relacoes)
 {
     EsquemasTabelas = esquemasTabelas;
     Relacoes = relacoes;
 }
예제 #11
0
        /// <summary>
        /// Gera os atributos da tabela atual
        /// Exemplo: 
        /// new CampoBD("ClienteID", false, System.Data.SqlDbType.Int, typeof(int), 0)
        /// </summary>
        public string GerarCamposObjeto(EsquemaTabela esquema)
        {
            string[,] cod = new string[esquema.Campos.Length, 7];

            for (int i = 0; i < esquema.Campos.Length; i++)
            {
                cod[i, 0] = "                new CampoBD(" + i + ",";
                cod[i, 1] = "\"" + esquema.Campos[i].NomeCampo + "\",";
                cod[i, 2] = esquema.Campos[i].PermiteNull.ToString().ToLower() + ",";
                cod[i, 3] = "SqlDbType." + esquema.Campos[i].TipoVariavelBD.ToString() + ",";
                cod[i, 4] = "typeof(" + PegarNomeTipo(esquema.Campos[i].TipoVariavel) + "),";
                cod[i, 5] = esquema.Campos[i].MaxLenght.ToString() + ",";
                cod[i, 6] = "TipoCampo." + esquema.Campos[i].TipoCampo.ToString() + ")";
                if (i + 1 < esquema.Campos.Length)
                {
                    cod[i, 6] += ",";
                }
            }
            return IdentarCodigoBlocos(cod);
        }
예제 #12
0
 /// <summary>
 /// Pega os indices das colunas
 /// Deve ter definido o esquema das tabelas
 /// </summary>
 public void PegarIndicesTabelas()
 {
     EsquemaTabela[] esquemas = EsquemasObjBD.EsquemasTabelas;
     for (int i = 0; i < esquemas.Length; i++)
     {
         if (esquemas[i].NomeTabela == TabelaPai)
         {
             IndexTabelaPai = i;
             EsquemaPai = esquemas[i];
         }
         if (esquemas[i].NomeTabela == TabelaFilha)
         {
             IndexTabelaFilha = i;
             EsquemaFilho = esquemas[i];
         }
     }
 }
        /// <summary>
        /// Pega as relações de uma tabela e já as define em um esquema de tabela
        /// </summary>
        /// <param name="esquema">O esquema da tabela</param>
        public static RelacaoBD[] PegarRelacoes(EsquemaTabela[] esquemas)
        {
            ControladorBD cBD = new ControladorBD();
            System.Data.DataTable tbRelacoes = cBD.LerT(@"SELECT
    K_Table = FK.TABLE_NAME,
    FK_Column = CU.COLUMN_NAME,
    PK_Table = PK.TABLE_NAME,
    PK_Column = PT.COLUMN_NAME,
    Constraint_Name = C.CONSTRAINT_NAME
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
    ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
    ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
    ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
            SELECT
                i1.TABLE_NAME,
                i2.COLUMN_NAME
            FROM
                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
            INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
                ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
            WHERE
                i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
           ) PT
    ON PT.TABLE_NAME = PK.TABLE_NAME");

            RelacaoBD[] relacoes = new RelacaoBD[tbRelacoes.Rows.Count];
            for (int i = 0; i < relacoes.Length; i++)
            {
                relacoes[i] = new RelacaoBD(
                            (string)tbRelacoes.Rows[i][0],
                            (string)tbRelacoes.Rows[i][1],
                            (string)tbRelacoes.Rows[i][2],
                            (string)tbRelacoes.Rows[i][3],
                            (string)tbRelacoes.Rows[i][4]);
            }
            return relacoes;
        }
예제 #14
0
        /// <summary>
        /// Gera os objetos filho desse 
        /// Gera como lista
        /// Exemplo: 
        /// List<tbCliente> tbClienteR { get; set; }
        /// </summary>
        public string GerarObjetosFilho(EsquemaTabela esquema)
        {
            if (esquema.RelacoesFilha == null)
                return "";

            string[,] cod = new string[esquema.RelacoesFilha.Length, 3];

            for (int i = 0; i < esquema.RelacoesFilha.Length; i++)
            {
                cod[i, 0] = "        public List<ObjetoBD> " + esquema.RelacoesFilha[i].TabelaFilha + "R";
                cod[i, 1] = "{ get { return PegarObjetosFilho(" + i + "); }";
                cod[i, 2] = "set { DefinirObjetosFilho(" + i + ", value); } }";
            }
            return @"        //Relações com tabelas filhas
" + IdentarCodigoBlocos(cod) + @"
";
        }
예제 #15
0
        /// <summary>
        /// Gera os objetos pai desse
        /// Exemplo: 
        /// tbEndereco tbEnderecoR { get; set; }
        /// </summary>
        public string GerarObjetosPai(EsquemaTabela esquema)
        {
            if (esquema.RelacoesPai == null)
                return "";

            string[,] cod = new string[esquema.RelacoesPai.Length, 4];

            for (int i = 0; i < esquema.RelacoesPai.Length; i++)
            {
                cod[i, 0] = "        public " + esquema.RelacoesPai[i].TabelaPai;
                cod[i, 1] = esquema.RelacoesPai[i].TabelaPai + "R";
                cod[i, 2] = "{ get { return (" + esquema.RelacoesPai[i].TabelaPai + ")PegarObjPai(" + i + "); }";
                cod[i, 3] = "set { DefinirObjPai(" + i + ", value); } }";
            }
            return @"
        //Relações com tabelas pai
" + IdentarCodigoBlocos(cod) + @"
";
        }
예제 #16
0
        /// <summary>
        /// Gera os atributos da tabela atual
        /// Exemplo:
        ///         public int?      CNPJ         { get { return (int?)PegarValor(2); } set { DefinirValor(8, value); } }
        /// </summary>
        public string GerarAtributosObjeto(EsquemaTabela esquema)
        {
            string[,] cod = new string[esquema.Campos.Length, 4];

            for (int i = 0; i < esquema.Campos.Length; i++)
            {
                Type tipo = esquema.Campos[i].TipoVariavel;
                string t = PegarNomeTipo(tipo);
                if (esquema.Campos[i].PermiteNull
                    && (tipo == typeof(int)
                    || tipo == typeof(decimal)
                    || tipo == typeof(double)
                    || tipo == typeof(DateTime)
                    || tipo == typeof(long)
                    || tipo == typeof(bool)))
                    t += "?";

                cod[i, 0] = "        public " + t;
                cod[i, 1] = esquema.Campos[i].NomeCampo;
                cod[i, 2] = "{ get { return (" + t + ") PegarValor(" + i + "); }";
                cod[i, 3] = "set { DefinirValor(" + i + ", value); } }";
            }
            return IdentarCodigoBlocos(cod);
        }
        /// <summary>
        /// Inverte os indices de dois esquemas
        /// </summary>
        static void InverterIndices(EsquemaTabela esquema1, EsquemaTabela esquema2, EsquemaTabela[] novoesquema)
        {
            int novoIndice1 = esquema2.IndiceTabela;
            int novoIndice2 = esquema1.IndiceTabela;

            esquema1.IndiceTabela = novoIndice1;
            esquema2.IndiceTabela = novoIndice2;

            novoesquema[novoIndice1] = esquema1;
            novoesquema[novoIndice2] = esquema2;
        }
 /// <summary>
 /// Continuação da função pegar primarykey e unique
 /// </summary>
 static void ConfigurarPkEUnique(DataView view, EsquemaTabela esquema)
 {
     //Verifica constraint por constraint
     for (int i = 0; i < view.Count; i++)
     {
         //Verifica coluna por coluna do esquema
         for (int j = 0; j < esquema.Campos.Length; j++)
         {
             string nomeColuna = (string)view[i][1];
             string tipo = (string)view[i][2];
             //Verifica se a coluna possui o mesmo nome
             if (esquema.Campos[j].NomeCampo == nomeColuna)
             {
                 if (tipo == "FOREIGN KEY")
                 {
                     if (esquema.Campos[j].TipoCampo == TipoCampo.Comum)
                         esquema.Campos[j].TipoCampo = TipoCampo.ForeignKey;
                     else if (esquema.Campos[j].TipoCampo == TipoCampo.PrimaryKey)
                         esquema.Campos[j].TipoCampo = TipoCampo.ForeignKey_PrimaryKey;
                     else
                         esquema.Campos[j].TipoCampo = TipoCampo.ForeignKey_Unique;
                 }
                 else if (tipo == "PRIMARY KEY")
                 {
                     if (esquema.Campos[j].TipoCampo == TipoCampo.Comum)
                         esquema.Campos[j].TipoCampo = TipoCampo.PrimaryKey;
                     else if (esquema.Campos[j].TipoCampo == TipoCampo.ForeignKey)
                         esquema.Campos[j].TipoCampo = TipoCampo.ForeignKey_PrimaryKey;
                     esquema.IndexColunaPK = j;
                 }
                 else if (tipo == "UNIQUE")
                 {
                     if (esquema.Campos[j].TipoCampo == TipoCampo.Comum)
                         esquema.Campos[j].TipoCampo = TipoCampo.Unique;
                     else if (esquema.Campos[j].TipoCampo == TipoCampo.ForeignKey)
                         esquema.Campos[j].TipoCampo = TipoCampo.ForeignKey_Unique;
                 }
             }
         }
     }
 }
        /// <summary>
        /// Pega as relações de uma tabela e já as define em um esquema de tabela
        /// </summary>
        /// <param name="esquema">O esquema da tabela</param>
        public static void PegarColunasPkEUnique(EsquemaTabela[] esquemas)
        {
            ControladorBD cBD = new ControladorBD();
            System.Data.DataTable tbPkEUnique = cBD.LerT(
                @"SELECT
                i1.TABLE_NAME,
                i2.COLUMN_NAME,
                i1.CONSTRAINT_TYPE
            FROM
                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
            INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
                ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME");
            DataView view = tbPkEUnique.DefaultView;

            for (int i = 0; i < esquemas.Length; i++)
            {
                view.RowFilter = "TABLE_NAME = '" + esquemas[i].NomeTabela + "'";
                ConfigurarPkEUnique(view, esquemas[i]);
            }
        }
예제 #20
0
 /// <summary>
 /// Pega os nomes das colunas da tabela e as ordena
 /// Exemplo: ContatoID, Nome, Telefone
 /// </summary>
 public string PegarNomesColunas(EsquemaTabela esquema)
 {
     string colunas = "";
     for (int i = 0; i < esquema.Campos.Length; i++)
     {
         colunas += esquema.Campos[i].NomeCampo;
         if (i + 1 < esquema.Campos.Length)
         {
             colunas += ", ";
         }
     }
     return colunas;
 }