No artigo anterior preparamos o ambiente de desenvolvimento instalando softwares, criando banco de dados e gerando os arquivos Cs e Hbml.xml, agora chegou à hora da codificação da tela, como podemos visualizar na Figura 1.

 

jfdanhibp3fig01.jpg 

Figura 1 – Formulário de Cadastro de Empresa

 

Acredito que todos os componentes e controles são conhecidos sendo que o que merece uma observação é o BSEmpresa (BindingSource) que veremos logo em seguida.

 

Esta tela possui um TabControl que contém em uma página um PictureBox para informação da imagem do Logotipo e na outra um DataGridView para visualização de todos os registros da tabela.

 

Para este form teremos também algumas variáveis que podem ser visualizadas na Listagem 1.

 

Configuration cfg;

ISessionFactory factory;

ISession session;

ITransaction transaction;

Empresa empresa;

Listagem 1 – Variáveis do Formulário

 

A variável cfg será responsável por carregar todos os arquivos hbml.xml que estão no resource do projeto.

 

Já a variável factory será responsável por carregar as informações que definimos no App.Config como a string de conexão, qual tipo do Banco de Dados e outras informações que estejam presentes neste arquivo.

 

Através desta variável será gerada uma sessão que será armazenada pela variável session e que por sua vez irá gerar uma transação sendo armazenada na variável transaction.

 

Todo este procedimento que foi descrito sobre as responsabilidades de cada variável iremos colocá-lo no evento Load do nosso formulário como mostra a Listagem 2.

 

cfg = new Configuration();

cfg.AddAssembly(this.GetType().Assembly);

 

factory = cfg.BuildSessionFactory();

session = factory.OpenSession();

transaction = session.BeginTransaction();

 

//Recuperando uma Lista de Registros

RefreshData();

dataGridView1.DataSource = BSEmpresa;

 

dataGridView1.Columns["Codemp"].HeaderText = "Código";

dataGridView1.Columns["Codemp"].DisplayIndex = 0;

 

dataGridView1.Columns["RazSoc"].HeaderText = "Razão Social";

dataGridView1.Columns["RazSoc"].DisplayIndex = 1;

dataGridView1.Columns["RazSoc"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

 

dataGridView1.Columns["Nomefan"].HeaderText = "Nome Fantasia";

dataGridView1.Columns["Nomefan"].DisplayIndex = 2;

dataGridView1.Columns["Nomefan"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

 

dataGridView1.Columns["Endereco"].HeaderText = "Endereço";

dataGridView1.Columns["Endereco"].DisplayIndex = 3;

dataGridView1.Columns["Endereco"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

 

dataGridView1.Columns["IsChanged"].Visible = false;

dataGridView1.Columns["IsDeleted"].Visible = false;

 

txtcodigo.DataBindings.Add("text", BSEmpresa, "codemp");

txtrazao.DataBindings.Add("text", BSEmpresa, "razsoc");

txtendereco.DataBindings.Add("text", BSEmpresa, "endereco");

txtnomefan.DataBindings.Add("text", BSEmpresa, "nomefan");

piclogo.DataBindings.Add("Image", BSEmpresa, "logotipo",true);

Listagem 2 – Inicializando variáveis e configurando controles

 

Além de iniciarmos as variáveis para a persistência de dados também configuramos os controles. O método RefreshData utilizado neste evento é responsável por carregar todos os registros da tabela Empresa, como é mostrado na Listagem 3.

 

   

 

 

 

 

void RefreshData()

{

   //Recuperando uma Lista de Registros

   session = factory.OpenSession();

   ICriteria criteria = session.CreateCriteria(typeof(Empresa));

   IList userList = criteria.List();

 

   BSEmpresa.DataSource = userList;

 

   if (userList.Count == 0)

      BSEmpresa.DataSource = new Empresa();

}

Listagem 3 – Método RefreshData

 

No método RefreshData podemos observar que a propriedade DataSource do BindingSource recebe como resultado o IList de todos os dados recuperados que é uma coleção do tipo Empresa.

 

A diferença de se utilizar o BindingSource é que nós podemos ligar os controles de tela com as propriedades da classe automaticamente, ficando assim mais fácil recuperar os valores do Banco de dados e mostrá-los na tela ou recuperar os valores da tela para gravar o Banco de Dados.

 

Sem o BindingSource teríamos que criar um objeto do tipo Empresa, recuperar os valores da tela e colocá-los nos campos respectivos do objeto para realizar a gravação. Com o BindingSource esta parte é automática.

 

Para a gravação dos dados o código é bem simples como pode ser visto na Listagem 4.

 

if (MessageBox.Show("Deseja gravar os dados no Banco de Dados?",

"Atenção!", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)

   return;

  

   BSEmpresa.EndEdit();

   empresa = (Empresa)BSEmpresa.Current;

  

   factory = cfg.BuildSessionFactory();

   session = factory.OpenSession();

   transaction = session.BeginTransaction();

 

   try

   {

      if (empresa.Codemp > 0)

         session.Update(empresa);

      else

         session.Save(empresa);

 

      transaction.Commit();

      RefresData();

   }

   Catch

   {

      MessageBox.Show("Erro ao atualizar o Banco de dados!", "Erro!",

         MessageBoxButtons.OK, MessageBoxIcon.Error);

      transaction.Rollback();

}

finally

{

   session.Close();

}

Listagem 4 – Código para a gravação dos dados

 

Resumindo este código podemos dizer que recuperamos no BindingSource o registro corrente, que na verdade é um objeto do tipo Empresa e setamos na nossa variável do tipo empresa. Abrimos uma sessão e iniciamos uma transação para a gravação do registro. Após este ponto temos que verificar se estamos alterando ou adicionando um novo registro, utilizei a propriedade CodEmp devido a mesma ser um campo auto-incremento pois só terá seu valor atualizado quando o registro for salvo no Banco de Dados, sendo assim foi possível determinar quando executar o método Save ou o método Update.

 

Para o código de exclusão de dados a única coisa que será alterada é o método Delete da variável session como pode ser visto na Listagem 5.

 

if (MessageBox.Show("Deseja excluir este registro do Banco de Dados?",

"Atenção!", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)

   return;

 

   BSEmpresa.EndEdit();

   empresa = (Empresa)BSEmpresa.Current;

 

   factory = cfg.BuildSessionFactory();

   session = factory.OpenSession();

   transaction = session.BeginTransaction();

 

   try

   {

      session.Delete(empresa);

      transaction.Commit();

      RefresData();

   }

   catch

   {

      MessageBox.Show("Erro ao atualizar o Banco de dados!", "Erro!",  

         MessageBoxButtons.OK, MessageBoxIcon.Error);

      transaction.Rollback();

   }

   finally

   {

      session.Close();

   }

Listagem 5 – Código de exclusão de Dados

 

Como vocês podem reparar não utilizamos nenhum comando SQL, nem para recuperar os dados nem para gravá-los ou excluí-los. Esta é uma das grandes vantagens de se utilizar a persistência de dados.

 

Há muito para ser explorado neste framework como a execução de comandos SQL, trabalhar com tabelas que possuem relacionamento dentre outras.

 

Espero ter ajudado vocês a conhecerem um pouco mais sobre este framework e até o próximo artigo.