/// <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>
        /// 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;
        }
 /// <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();
     }
 }
Example #4
0
 /// <summary>
 /// Configura todos os esquemas das tabelas
 /// </summary>
 public static void ConfigurarEsquemas(EsquemaTabela[] esquemasTabelas, RelacaoBD[] relacoes)
 {
     EsquemasTabelas = esquemasTabelas;
     Relacoes = relacoes;
 }