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.
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.