Você está na página 1de 8

VB.

NET - Criando uma aplicao em 3 camadas

http://www.macoratti.net/vbn_3cm.htm

VB.NET - Criando uma aplicao em 3 camadas (MVC)


No artigo - Padres de Projeto : O modelo MVC - Model View Controller - falei sobre os padres de projeto , mais especificamente do modelo MVC. Vou mostrar neste artigo um exemplo prtico de como podemos criar uma aplicao em 3 camadas , bem prxima do modelo MVC , usando o VB.NET. Vou criar um projeto do tipo VB.NET com um formulrio e um datagrid usando o acesso a dados via DataSet para criar uma aplicao em 3 camadas que permita acessar , alterar e atualizar os dados usando o DataGrid e refletir isto em um DataSet que representa a tabela Customer do banco de dados Northwind.mdb. O cdigo ir mostrar como enviar novas linhas (registros) , alterar linhas e excluir linhas usando uma camada de servios que atualiza o banco de dados usando um DataSet. Iremos dividir logicamente nosso projeto em 3 partes :

1. Camada de apresentao - Contm o cdigo dos formulrios Windows - Windows Forms - como o
usurio e os servios de negcios.

2. Camada de negcios : Contm o cdigo para os servios de negcios 3. Camada de dados : O banco de dados Northwind.mdb - tabela Customer.
A aplicao que irei desenvolver pode ser dividido em dois projetos distintos : Um projeto baseado em Windows-Forms para apresentar os dados para o usurio e um projeto do tipo Class Library para gerenciar as regras de negcios e fazer a chamada para manipular os dados. (Os servios de negcios ficariam responsveis pelas tarefas de retornar e atualizar os dados na fonte de dados.)

A camada de apresentao - Windows Forms


Vamos comear com a camada de apresentao. Abaixo temos o formulrio do projeto com os seguintes componentes: - 1 DataGrid grdData - 3 Buttons Button1 , Button2 e Button3 O componente DataGrid ir exibir os dados ao usurio e os botes iro ter as seguintes funcionalidades : Carregar Dados carrega o DataSet com dados da

1 de 8

01/04/2012 09:43

VB.NET - Criando uma aplicao em 3 camadas

http://www.macoratti.net/vbn_3cm.htm

tabela e exibe Salvar Dados Salva as alteraes no Dataset Sair - sai da aplicao. Por que estou usando um DataGrid ? Bem... O DataGrid um controle de Servidor que pode ser facilmente manipulado para renderizar um conjunto de registros pela vinculao com um DataSet. Voc deve estar meio desconfiado e deve tambm estar duvidando que possvel criar uma aplicao 3 camadas da forma com eu estou fazendo. Com certeza ao ler que eu vou vincular o DataSet ao DataGrid voc pode at pensar que a vinculao ser feita feita como nos velhos tempos do VB6. Calma !!! No mundo .NET vincular tem um sentido muito diferente. Quando um DataSet vinculado a um DataGrid , os dados do DataSet so copiados para o DataGrid. As alteraes feitas nos dados do DataGrid so ento repassadas para o DataSet para refletir as mundaas. Qual a diferena ??? Vou explicar ... Quando voc usava o VB6 e a ADO (lembra ???) as tcnicas de vinculao de dados envolviam vincular os dados do Grid diretamente a um controle Data e dai para o banco de dados. Neste esquema a conexo com o banco de dados fica aberta o que limita muito nossa aplicao pois voc tem a camada de apresentao diretamente ligada com a camada de dados. Com o VB .NET temos o grid ainda vinculado ao DataSet , mas o DataSet no tem uma conexo com o banco de dados. Na verdade o DataSet nem mesmo sabe ou se importa em saber de onde os dados esto vindo. O DataSet pode ser preenchido com dados a partir de uma variedade de fonte de dados e at mesmo se preenchido manualmente sem fonte de dados alguma. Ai que esta a diferena... Quando o usurio altera os dados no DataGrid do formulrio, as mudanas so enviadas ao DataSet de forma automtica. Qualquer nova linha de registro includa tambm includa no DataSet e qualquer linha alterada atualizada no DataSet. Linhas excludas do DataGrid so removidas do DataSet (elas so marcadas como excluidas). O DataSet trata todas as mudanas nos dados armazenando o valor original e atual de cada linha e coluna. Assim , se um DataGrid contiver 1000 linhas de dados e o usurio alterar 3 linhas, incluir 1 nova linha e excluir outras 2 linhas, as linhas afetadas podem ser extraadas do DataSet vinculado para outro DataSet de maneira que o novo DataSet ir conter somente estas 6 linhas alteradas.

2 de 8

01/04/2012 09:43

VB.NET - Criando uma aplicao em 3 camadas

http://www.macoratti.net/vbn_3cm.htm

A seguir o cdigo da classe frmMain : Aqui temos a classe frmMain onde a varivel m_oDS representa o DataSet. Public Class frmMain Inherits System.Windows.Forms.Form '//---------------------------------------------------------------------------------------------------'// Declara varivel de class '//---------------------------------------------------------------------------------------------------Private m_oDS As DataSet '//---------------------------------------------------------------------------------------------------'// Retorna e carrega os dados para o formulrio '//---------------------------------------------------------------------------------------------------Private Sub LoadData() Dim oCustomer As BusinessServices.Customer = New BusinessServices.Customer() grdData.DataBindings.Clear() m_oDS = oCustomer.GetData() grdData.DataSource = m_oDS.Tables("Customer") oCustomer = Nothing End Sub '//-----------------------------------------------------------------------------------------------------------'// Envia os dados alterados para os servios de negcios '//-----------------------------------------------------------------------------------------------------------Private Sub SaveData() Dim lRetVal As Long Dim oCustomer As BusinessServices.Customer = New BusinessServices.Customer() Dim oDS_Delta As DataSet Dim sMsg As String '//--- Verifica se houve alteraes If m_oDS Is Nothing Then Exit Sub If Not m_oDS.HasChanges() Then Exit Sub '//--- Trata todas as mudanas oDS_Alterados = m_oDS.GetChanges() sMsg = "Esta certo que quer salvar " & oDS_Alterados.Tables(0).Rows.Count() & " linhas da fonte de dados ? " lRetVal = MsgBox(sMsg, Microsoft.VisualBasic.MsgBoxStyle.Question + Microsoft.VisualBasic.MsgBoxStyle.YesNo, "Salva Dados") Select Case lRetVal Case vbYes Try '//--- Salva todas as alteraes sMsg = oCustomer.SaveData(oDS_Alterados) LoadData() Catch e As Exception sMsg = "Erro ao salvar dados." & vbCrLf & vbCrLf & e.Message.ToString() Finally MsgBox(sMsg, Microsoft.VisualBasic.MsgBoxStyle.Information, "Salva Dados") End Try Case vbNo '//--- Nada End Select oDS_Delta = Nothing

3 de 8

01/04/2012 09:43

VB.NET - Criando uma aplicao em 3 camadas

http://www.macoratti.net/vbn_3cm.htm

oCustomer = Nothing End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click LoadData() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click SaveData() End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Me.Dispose() End Sub End Class

- Quando o usurio clicar no boto - Carregar Dados - o mtodo LoadData() ser invocado . Nele
estamos declarando e criando uma instncia da classe servios de negcios : Dim oCustomer As BusinessServices.Customer = New BusinessServices.Customer() - A seguir declaramos a vinculao de dados e iniciamos com o status clear (limpo). Ento usamos o mtodo GetData do objeto de servios de negcios - oCustomer - para retornar o DataSet preenchido com os dados da tabela - Customer - para o formulrio atravs do DataGrid. Feito isto o DataSet ser local e estar vinculado ao DataGrid. grdData.DataBindings.Clear() m_oDS = oCustomer.GetData() grdData.DataSource = m_oDS.Tables("Customer") oCustomer = Nothing

- Com os dados preenchendo o DataGrid e sendo exibidos no formulrio o usurio poder interagir com
os dados via interface : alterando , excluindo e incluindo novos registros. Para salvar as alteraes o usurio ir clicar no boto - Salvar Dados - que ir invocar o mtodo SaveData(). - O mtodo SaveData() cria uma instncia dos objetos de servios - BusinessServices.Customer() e verifica se houve qualquer alterao nos dados usando o mtodo HasChanges(). Como o DataSet esta vinculado ao DataGrid qualquer alterao feita ser refletida no DataSet. Havendo alteraes eu utilizo a varivel oDS_Alterados para armazenar os registros alterados : oDS_Alterados = m_oDS.GetChanges() - O mtodo GetChanges do DataSet copia as linhas alteradas do DataSet e as coloca em um novo DataSet: oDS_Alterados. - Finalmente o usurio dever confirmar se deseja salvar as alteraes

A camada de servios
A camada de servios definida em uma classe chamada : BusinessServices. O cdigo da classe esta descrito a seguir : '//--------------------------------------------------------------------------------------------------------

4 de 8

01/04/2012 09:43

VB.NET - Criando uma aplicao em 3 camadas

http://www.macoratti.net/vbn_3cm.htm

'// Declara todos os NameSpaces que sero referenciados '//-------------------------------------------------------------------------------------------------------Imports System Imports System.Data Imports System.Data.OleDb '//-------------------------------------------------------------------------------------------------------------'// NameSpace BusinessServices '//-------------------------------------------------------------------------------------------------------------Namespace BusinessServices Public Class Customer '//---------------------------------------------------------------------------------------------------'// Declara as variveis de Classe '//---------------------------------------------------------------------------------------------------Private m_sProvider As String = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" Private m_sServer As String = "DATA SOURCE=C:/teste/" ' Private m_sDatabase As String = "Northwind1.mdb" Private m_oDS As DataSet Private m_oCn As OleDbConnection Private m_oDA As OleDbDataAdapter Private m_sClassName As String = "Customer" '//--- o nome da classe '//---------------------------------------------------------------------------------------------------'// Constructor (sem argumentos) '//---------------------------------------------------------------------------------------------------Sub New() Dim sSQL As String = "" Dim oSelCmd As OleDbCommand Dim oInsCmd As OleDbCommand Dim oUpdCmd As OleDbCommand Dim oDelCmd As OleDbCommand '--------------------------------------------------------'--- define a conexao '--------------------------------------------------------InitializeConnection() '--------------------------------------------------------'--- define o SELECT Command '--------------------------------------------------------sSQL = "SELECT CustomerID, CompanyName, ContactName, City, Region FROM Customers ORDER BY CompanyName " oSelCmd = Nothing oSelCmd = New OleDbCommand(sSQL, m_oCn) oSelCmd.CommandType = CommandType.Text '--------------------------------------------------------'--- define o UPDATE Command '--------------------------------------------------------sSQL = "UPDATE Customers " & _ " SET CompanyName = @CompanyName , ContactName = @ContactName, City = @City, Region = @Region WHERE CustomerID = @CustomerID " oUpdCmd = Nothing oUpdCmd = New OleDbCommand(sSQL, m_oCn) With oUpdCmd .CommandType = CommandType.Text With .Parameters

5 de 8

01/04/2012 09:43

VB.NET - Criando uma aplicao em 3 camadas

http://www.macoratti.net/vbn_3cm.htm

.Add(New OleDbParameter("@CompanyName", OleDbType.VarChar, 40, "CompanyName")) .Add(New OleDbParameter("@ContactName", OleDbType.VarChar, 30, "ContactName")) .Add(New OleDbParameter("@City", OleDbType.VarChar, 15, "City")) .Add(New OleDbParameter("@Region", OleDbType.VarChar, 15, "Region")) .Add(New OleDbParameter("@CustomerID", OleDbType.LongVarChar, 5, "CustomerID")) End With End With '--------------------------------------------------------'--- define o INSERT Command '--------------------------------------------------------sSQL = "INSERT INTO Customers " & _ " (CompanyName, ContactName, City, Region, CustomerID) VALUES (@CompanyName, @ContactName, @City, @Region, @CustomerID)" oInsCmd = Nothing oInsCmd = New OleDbCommand(sSQL, m_oCn) With oInsCmd .CommandType = CommandType.Text With .Parameters .Add(New OleDbParameter("@CompanyName", OleDbType.VarChar, 40, "CompanyName")) .Add(New OleDbParameter("@ContactName", OleDbType.VarChar, 30, "ContactName")) .Add(New OleDbParameter("@City", OleDbType.VarChar, 15, "City")) .Add(New OleDbParameter("@Region", OleDbType.VarChar, 15, "Region")) .Add(New OleDbParameter("@CustomerID", OleDbType.LongVarChar, 5, "CustomerID")) End With End With '--------------------------------------------------------'--- define o DELETE Command '--------------------------------------------------------sSQL = "DELETE Customers WHERE CustomerID = @CustomerID " oDelCmd = Nothing oDelCmd = New OleDbCommand(sSQL, m_oCn) With oDelCmd .CommandType = CommandType.Text With .Parameters .Add(New OleDbParameter("@CustomerID", OleDbType.LongVarChar, 5, "CustomerID")) End With End With '--------------------------------------------------------'--- cria e define os comandos para o DataSet '--------------------------------------------------------m_oDA = New OleDbDataAdapter() With m_oDA .SelectCommand = oSelCmd .UpdateCommand = oUpdCmd .DeleteCommand = oDelCmd .InsertCommand = oInsCmd End With

6 de 8

01/04/2012 09:43

VB.NET - Criando uma aplicao em 3 camadas

http://www.macoratti.net/vbn_3cm.htm

'//--- Destroi o objeto connection m_oCn = Nothing End Sub '//-----------------------------------------------------------------------------------------------------------Public Function SaveData(ByVal oDS As DataSet) As String Dim sMsg As String Dim lRecsAffected As Long Dim oTran As OleDb.OleDbTransaction '--------------------------------------------------------'//--- Salva os dados '--------------------------------------------------------Try '--- define a conexao InitializeConnection() m_oCn.Open() '--- inicia a transacao oTran = m_oCn.BeginTransaction() '--- atualiza o banco de dados lRecsAffected = m_oDA.Update(oDS, m_sClassName) '--- consolida (commit) as mudanas oTran.Commit() '--- define as mensagens para o usuario sMsg = lRecsAffected & " registros foram atualizados" Catch e As Exception '--- Ocorreu um erro Desfaz a transacao oTran.Rollback() sMsg = "Os registros no foram atualizados." & vbCrLf & e.Message.ToString() Finally '--- Fecha a conexao oTran = Nothing m_oCn.Close() m_oCn = Nothing SaveData = sMsg End Try End Function '//-----------------------------------------------------------------------------------------------------------// retorna os dados da tabela clientes '//-----------------------------------------------------------------------------------------------------------Public Function GetData() As DataSet '--- Cria um novo datase m_oDS = New DataSet() '--- preenche o dataset com os dados dos clientes m_oDA.Fill(m_oDS, m_sClassName) '//--- Retorna o dataset Return m_oDS End Function '//-----------------------------------------------------------------------------------------------------------'// Inicializa a conexo '//-----------------------------------------------------------------------------------------------------------Private Sub InitializeConnection() '--- define a conexao m_oCn = New OleDbConnection(m_sProvider & m_sServer & m_sDatabase) End Sub

7 de 8

01/04/2012 09:43

VB.NET - Criando uma aplicao em 3 camadas

http://www.macoratti.net/vbn_3cm.htm

End Class End Namespace

A camada de acesso a dados vai ser discutida em outros artigos sobre o tema mas creio que deu para dar uma viso geral sobre o assunto. Aguarde mais artigos sobre o tema em breve ... Eu sei apenas VB .NET mas eu gosto: Referncias:

Padres de Projeto Padres de Projeto - O modelo MVC - Model View Controller


Jos Carlos Macoratti

8 de 8

01/04/2012 09:43

Você também pode gostar