;

quinta-feira, 20 de janeiro de 2011

Usando NHibernate - Parte II

No artigo anterior (Usando NHibernate - Parte I) falei sobre o framework NHibernate, utilizado para persistir dados de objetos .NET em bases de dados relacionais. Expliquei rapidamente o propósito da ferramenta e mostrei como mapear as classes e tabelas do banco de dados. Apresentei também um exemplo de código para fazer a inserção e consulta de dados.Seguindo no assunto, hoje irei mostrar como fazer para atualizar e deletar registros em uma tabela.

Para tanto, abra a aplicação criada para o exemplo do antigo anterior (se não tem a aplicação, pegue o código aqui). Insira mais dois botões no form do projeto: um para atualizar o registro selecionado na lista e o outro para excluir o registro selecionado. De fato, não é muito funcional, mas a idéia é apenas mostrar as funcionalidades do NHibernate. 

Atualizando um registro

Para atualizar um registro, crie um método para tratar o clique no botão Atualizar, com o código abaixo:

private void Atualizar_Click(object sender, EventArgs e)
{
    try
    {
        Configuration cnfg = new Configuration();

        //Assembly dos arquivo .hbm.xml
        cnfg.AddAssembly("Cadastro");
        //seta o dialeto do banco de dados
        cnfg.SetProperty("hibernate.dialect", "NHibernate.Dialect.MsSql2005Dialect");

        //criação de uma sessao
        ISessionFactory oFactory = cnfg.BuildSessionFactory();
        ISession oSession = oFactory.OpenSession();
        //iniciando uma transação
        ITransaction oTransaction = oSession.BeginTransaction();

        Cliente cli = (Cliente)oSession.Load(typeof(Cliente), grid.SelectedRows[0].Cells[0].Value);

        cli.Nome += " - Alterado";
        oTransaction.Commit();
        oSession.Close();

        carregaDados();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Repare que o que apenas carrego um objeto da classe Cliente com o método oSession.Load(). Em seguida altero a propriedade nome do objeto “cli”, e atualizo no banco, ao chamar o método Update da classe ISession. Importante: não esqueça dar o commit na transação, para confirmar a operação.

Excluindo um registro

Para excluir um registro com NHibernate, basta fazer uma pequena alteração no código anterior. Crie um método para o evento de clique no botão Excluir e insira o seguinte código:

private void Excluir_Click(object sender, EventArgs e)
{
    try
    {
        Configuration cnfg = new Configuration();

        //Assembly dos arquivo .hbm.xml
        cnfg.AddAssembly("Cadastro");
        //seta o dialeto do banco de dados
        cnfg.SetProperty("hibernate.dialect", "NHibernate.Dialect.MsSql2005Dialect");

        //criação de uma sessao
        ISessionFactory oFactory = cnfg.BuildSessionFactory();
        ISession oSession = oFactory.OpenSession();
        //iniciando uma transação
        ITransaction oTransaction = oSession.BeginTransaction();

        Cliente cli = (Cliente)oSession.Load(typeof(Cliente), grid.SelectedRows[0].Cells[0].Value);
        oSession.Delete(cli);

        oTransaction.Commit();
        oSession.Close();

        carregaDados();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Veja que, assim como no método anterior, carrego um objeto da classe cliente – a partir do item selecionado no grid, e solicito a exclusão do registro relativo ao objeto através da chamada do método Delete, da classe ISession. E claro, é necessário dar o commit na transação, para confirmar a exclusão.

Sem dúvida o NHibernate é uma ferramenta que facilita e agiliza muito o desenvolvimento de aplicações .NET. Na próxima publicação darei continuidade ao artigo sobre  NHibernate. Dúvidas, sugestões ou críticas? Deixe um comentário, ou mande um email para o endereço que está na página de contato.

6 comentários:

Anônimo disse...

Mto bacana o tutorial! Vai ter continuações?
Obrigado!

Gabriel Bauermann disse...

Obrigado pele comentário.

De fato tenho tido pouco tempo para produzir novos artigos. Mas pretendo sim falar mais sobre NHibernate, até pq eu mesmo qro aprofundar meus conhecimentos sobre esta ferramenta.

Abraço

Anônimo disse...

Parebens pelo artigo, realmente muito bom!

tenho uma duvida:
-pq usar transaction para uma consulta

abraço
Ernakh

Gabriel Bauermann disse...

Olá Ernakn

Realmente, tens razão. Aprendi o que sei de NHibernate lendo artigos e a documentação do framework. Me baseei em exemplos para estudar, vi sendo usado desta forma e não tentei fazer a consulta sem usar transação. Farei este teste.

Obrigado pela colaboração.

Anônimo disse...

Pelo que pesquisei, o banco sempre faz transaction por baixo dos panos, por isso o NHIbernate requer isso, fazendo explicitamente!

não tenho certeza, mas acho que é isso
Abraço
Ernakh(fabriciotonettolondero@gmail.com)

Gabriel Bauermann disse...

Faz todo o sentido Ernakh, mas vou pesquisar isto, para tirar esta dúvida.
Obrigado pela colaboração. Ajudas sempre são bem vindas.
Abraço

Postar um comentário