CLASSE DAL NOVA
Estou quase finalizando minha classe DAL.
Que pretendo usar para futuros projetos em .NET.
Quando terminar,pretendo expor aqui,para validação
dos colegas,apontamento de falhas,etc...
No entanto ,tem um método da classe que esta me
deixando com dúvida:
Me refiro ao método [Ô]Retrive[Ô] do CRUD no DAL.
A minha idéia inicial é criar 2 métodos:
- O primeiro que recupera apenas um registro,usando como parâmetro o código.
- O segundo método recuperando todos os dados da tabela
Minhas dúvidas:
1. Em casos de cadastro (Funcionários,Cliente,etc...)Pretendo usar o primeiro método
para retornar somente o registro que interessa.Fica a pergunta.O melhor neste caso
é criar o método retornado um Dataset ou DataReader,um DataTable ou Datarow??????
2.)Eu vi um exemplo de DAL gerado por um gerador automático que me deixou intrigado.
Os métodos de pesquisa deste gerador,estavam retornando um objeto do mesmo tipo da
classe de negócio.Por exemplo,ao invés dos métodos de pesquisa da DAL retornar um objeto do
tipo DataSet,DataTable,etc... estava retornando um objeto do mesmo tipo da Classe de negócio.
Tem um motivo para isto em OO???
Citação:1. Em casos de cadastro (Funcionários,Cliente,etc...)Pretendo usar o primeiro método
para retornar somente o registro que interessa.Fica a pergunta.O melhor neste caso
é criar o método retornado um Dataset ou DataReader,um DataTable ou Datarow??????
Nenhum dos três, você vai retornar uma classe que você construiu que é preenchida no métodos.
Citação:2.)Eu vi um exemplo de DAL gerado por um gerador automático que me deixou intrigado.
Os métodos de pesquisa deste gerador,estavam retornando um objeto do mesmo tipo da
classe de negócio.Por exemplo,ao invés dos métodos de pesquisa da DAL retornar um objeto do
tipo DataSet,DataTable,etc... estava retornando um objeto do mesmo tipo da Classe de negócio.
Tem um motivo para isto em OO???
Tem certeza que era da classe de negócio ou era um entidade(uma classe)?
Vai usar SQL Server? Se for, me passa uma cópia(com dados fictÃcios), eu crio um projeto pra você com um exemplo básico. Pelo que vi, você ainda não entendeu OOP
Talvez,eu tenha me expressado mal,por causa de meu pouco conhecimento de OO.
Simplificando:
Imagnine a situação mais simples possÃvel,por exemplo:
Um cadastro de Clientes:
- Tenho uma classe (ClCliente),com 3 atributos : CodCli,DescCli e Tel . Nesta mesma Classe os métodos : Inserir,Recuperar,Atualizar e deletar.
- Na BD (SqlServer express) tenho : Tb_Cliente (CodCli,DescCli e Tel)
Digamos que eu tenha minha classe DAL,justamente para permitir aos métodos da classe (ClCliente) realizar as operações no BD.
Minha dúvida,é no método Recuperar da Classe ClCliente. Pretendo usar como parâmetro de pesquisa o atributo CodCli.Mas que objeto é o correto
fazer retornar neste caso,ao fazer a pesquisa????
Citação:Minha dúvida,é no método Recuperar da Classe ClCliente. Pretendo usar como parâmetro de pesquisa o atributo CodCli.Mas que objeto é o correto
fazer retornar neste caso,ao fazer a pesquisa????
Parafraseando Arnaldo César Coelho: A regra é clara. Se for para ler dados, use SEMPRE DataReader
Minha dúvida é justamente esta.Me parece razoável que o método de pesquisa retorne
um objeto como Dataset,DataTable ou como você aconselhou um DataReader.Mas repare
o método abaixo,que foi gerado por um gerador automático de DAL. Ele faz retornar um objeto do
mesmo tipo da classe (TbDepFields).Minha dúvida é simples:
Sei que consigo,retornar o que quero usando um objeto do ADO.ET (DataReader,DataSet,DataTable,etc..),Sei
que posso fazer como no exemplo abaixo.Retornando um objeto do mesmo tipo da classe.Mas......
Qual a vantagem de se retornar um objeto do tipo classe,nos métodos de pesquisa do CRUD???????
Public Function GetItem(ByVal Param_CodDep As Integer) As TbDepFields
Dim infoFields As New TbDepFields()
Try
Me.Conn = New SqlConnection(Me.StrConnetionDB)
Me.Cmd = New SqlCommand([Ô]Proc_TbDep_Select[Ô], Me.Conn)
Me.Cmd.CommandType = CommandType.StoredProcedure
Me.Cmd.Parameters.Clear()
Me.Cmd.Parameters.Add(New SqlParameter([Ô]@Param_CodDep[Ô], SqlDbType.Int)).Value = Param_CodDep
Me.Cmd.Connection.Open()
Using dr As SqlDataReader = Me.Cmd.ExecuteReader(CommandBehavior.SequentialAccess)
If Not dr.HasRows Then
Return Nothing
End If
If dr.Read() Then
infoFields = GetDataFromReader(dr)
End If
End Using
Return infoFields
Catch e As SqlException
[ô]Me._ErrorMessage = String.Format([Ô]Houve um erro imprevisto ao tentar selecionar o(s) registro(s) solicitados: Código do erro: {0}, Mensagem: {1}, Procedimento: {2}, Linha do erro {3}.[Ô], e.ErrorCode, e.Message, e.Procedure, e.LineNumber)
Me._ErrorMessage = String.Format([Ô]Houve um erro imprevisto ao tentar selecionar o(s) registro(s) solicitados: {0}.[Ô], e.Message)
Return Nothing
Catch e As Exception
Me._ErrorMessage = e.Message
Return Nothing
Finally
If Me.Conn IsNot Nothing Then
If Me.Conn.State = ConnectionState.Open Then
Me.Conn.Dispose()
End If
End If
End Try
End Function
Citação:Qual a vantagem de se retornar um objeto do tipo classe,nos métodos de pesquisa do CRUD???????
Considere o objeto Form. Imagine que o que você quer é nada mais que as dimensões do mesmo, largura e altura. Para fazer isto, você instancia uma variável do tipo <Form>. Ele vai carregar uma série de outras propriedades que você não vai precisar, além de executar métodos(como o construtor), sem que você queira. Isto onera em muito a aplicação, pois é um objeto pesado.
Agora imagine que você tem uma classe que retorne uma List<Cliente>. Existe um método que executa um DataReader e preenche esta lista. Você vai ter uma lista de objetos que conterão apenas o que você precisa, um objeto bem mais compacto, especializado e menos oneroso ao seu sistema.
Resumindo, usa-se classes para especialização de funcionalidade e otimização de performance.