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