none
Como desenvolver uma Classe "Objeto" para vários bancos de dados, ou seja, multi-banco? RRS feed

  • Pergunta

  • Boa noite a todos.

    Trabalho em uma empresa de desenvolvimento de software. Nosso sistema é desktop com banco de dados Oracle.
    A empresa está passando por mudanças e o software vai ser atualizado para Web utilizando a linguagem C#, porem, o mercado necessita de uma ferramenta que acesse vários bancos, o que no nosso caso seria Oracle, SqlServer e Postgres inicialmente.

    Alguem poderia dar um help por favor, estamos precisando urgente de uma solução? Pode ser algum exemplo demo, tutoriais, etc...

    sexta-feira, 26 de março de 2010 03:37

Respostas

  • Amigo nos meus projetos eu trabalho da seguinte forma.

    Tenho uma interface chamada IDados q possui os métodos

    AddParameter(string key,object value); //adiciona um parametro na lista de parametros
    Clear(); //limpa os parametros
    QueryExecute(string sql); //executa um sql sem retorno (insert, update);
    QueryTable(string sql); //executa um sql e retorna um DataTable (selects)
    ProcExecute(string proc); //executa uma procedure sem retorno
    ProcTable(string proc); //executa uma procedure e retorna um DataTable

    ai no caso eu implemento essa interface pra SQL Server, MySql, Oracle

    tenho a classe clsDados que tem um método chamado GetInstance(); q retorna um IDados. Quando esse método é chamado eu verifico qual classe q vou retornar e retorno ou uma SQLServerDados, MySqlDados, OracleDados....

     

    na minha camada de Negocio faço algo assim

    clsCliente objC = new clsCliente();
    objC.Nome = "Milton";
    objC.Idade = 20;

    BLLCliente negCliente = new BLLCliente();
    negCliente.Incluir(objC);

    no método Incluir dentro da BLLCliente eu faço assim

    IDados objDados = clsDados.GetInstance();
    StringBuilder sql = new StringBuilder();
    sql.append(" INSERT INTO Clientes")
    sql.append(" (Nome, Idade) VALUES");
    sql.append(" (@Nome, @Idade)")

    objDados.addParameter("@Nome",objCliente.Nome);
    objDados.addParameter("@Idade",objCliente.Idade);
    objDados.QueryExecute(sql.ToString());

    eu uso essa estrutura em meus projetos e não tenho problemas com ela e fica bem flexivel


    1000ton - MSN: milton.filho@msn.com
    domingo, 28 de março de 2010 00:26
  • Acho que a resposta pra essa pergunta é factory. Usar uma factory pra cada objeto desse tipo que vc vai construir. É esse cara que vai saber qual instanciar, do lado de fora vc trabalha sempre com as abstracoes. IDbConnection, IDatatable, IDbTransaction, etc.

     

    Mas se vcs vao ter que mudar isso, pq nao pensam em usar um ORM? Pode ser uma boa oportunidade.


    Gustavo Rocha, MCTS, MCPD, CSM, Arquiteto de Software - http://subindoaladeira.wordpress.com/
    quinta-feira, 8 de abril de 2010 15:33
  • NHibernate é a solução. Ele possui os providers para os bancos que vc precisa. A unica coisa que vc precisa mudar é o xml de configuração pra trocar de banco.

     


    Se sua pergunta foi respondida por favor marque a resposta como certa.
    sexta-feira, 9 de abril de 2010 22:54

Todas as Respostas

  • Amigo nos meus projetos eu trabalho da seguinte forma.

    Tenho uma interface chamada IDados q possui os métodos

    AddParameter(string key,object value); //adiciona um parametro na lista de parametros
    Clear(); //limpa os parametros
    QueryExecute(string sql); //executa um sql sem retorno (insert, update);
    QueryTable(string sql); //executa um sql e retorna um DataTable (selects)
    ProcExecute(string proc); //executa uma procedure sem retorno
    ProcTable(string proc); //executa uma procedure e retorna um DataTable

    ai no caso eu implemento essa interface pra SQL Server, MySql, Oracle

    tenho a classe clsDados que tem um método chamado GetInstance(); q retorna um IDados. Quando esse método é chamado eu verifico qual classe q vou retornar e retorno ou uma SQLServerDados, MySqlDados, OracleDados....

     

    na minha camada de Negocio faço algo assim

    clsCliente objC = new clsCliente();
    objC.Nome = "Milton";
    objC.Idade = 20;

    BLLCliente negCliente = new BLLCliente();
    negCliente.Incluir(objC);

    no método Incluir dentro da BLLCliente eu faço assim

    IDados objDados = clsDados.GetInstance();
    StringBuilder sql = new StringBuilder();
    sql.append(" INSERT INTO Clientes")
    sql.append(" (Nome, Idade) VALUES");
    sql.append(" (@Nome, @Idade)")

    objDados.addParameter("@Nome",objCliente.Nome);
    objDados.addParameter("@Idade",objCliente.Idade);
    objDados.QueryExecute(sql.ToString());

    eu uso essa estrutura em meus projetos e não tenho problemas com ela e fica bem flexivel


    1000ton - MSN: milton.filho@msn.com
    domingo, 28 de março de 2010 00:26
  • Obrigado 1000ton, como sou iniciante no assunto multi-banco estou meio boiando.
    Como vc sabe quando está conectado no Oracle, SqlServer, Postgres, etc... Sabemos que em C# temos vários obj de conexao como SQLConnection, OracleConnection, etc...
    Como vc trata isso?
    Qual seria a melhor prática para isso?

     

    segunda-feira, 29 de março de 2010 01:37
  • Acho que a resposta pra essa pergunta é factory. Usar uma factory pra cada objeto desse tipo que vc vai construir. É esse cara que vai saber qual instanciar, do lado de fora vc trabalha sempre com as abstracoes. IDbConnection, IDatatable, IDbTransaction, etc.

     

    Mas se vcs vao ter que mudar isso, pq nao pensam em usar um ORM? Pode ser uma boa oportunidade.


    Gustavo Rocha, MCTS, MCPD, CSM, Arquiteto de Software - http://subindoaladeira.wordpress.com/
    quinta-feira, 8 de abril de 2010 15:33
  • NHibernate é a solução. Ele possui os providers para os bancos que vc precisa. A unica coisa que vc precisa mudar é o xml de configuração pra trocar de banco.

     


    Se sua pergunta foi respondida por favor marque a resposta como certa.
    sexta-feira, 9 de abril de 2010 22:54