BOAS PRATICAS

VARUS 15/09/2016 10:47:19
#466958
Primeiro vou explicar como fazia;

Adicionava uma DataGridView escondida (atrás de controles(GroupBox, PictureBox)) e nela, eu carregava os dados do banco de dados mysql. Criava um UserControl para receber os dados, percorria as linhas do DataGrid e setava os dados no UserControl da DataGrid, eu já tinha em mente que isso era um POG monstro (como também demorava para criar os controles (UserControl) no FlowLayout), porém não imaginava outras formas de fazer isso, até que nosso amigo KERP, clareou a mente com o OOP. O que sei é o basico do basico do basico, mas acho que estou no caminho certo

comecei a fazer desta forma;

Minha classe;
  Public Class Dados1
Public Id As Integer
Public Property nome As String
Public Property idade() As Integer

Public Sub New(_id As Integer, _nome As String, _idade As Integer)
Me.Id = _id
Me.nome = _nome
Me.idade = _idade
End Sub


End Class




E o form;

  Public Class Form1
Dim liste As New List(Of Dados1)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Using conn As New MySqlConnection([Ô]server=localhost;user id=root;password=123456;database=test[Ô])
Using cmd As New MySqlCommand([Ô]SELECT * FROM Clientes[Ô], conn)
conn.Open()
Using rdr As MySqlDataReader = cmd.ExecuteReader()
While rdr.Read()
liste.Add(New Dados1(rdr(0), rdr.Item([Ô]nome[Ô]), rdr.Item([Ô]idade[Ô])))
End While
End Using
End Using
End Using

End Sub

[ô]Aqui é a pesquisa na List(of..)
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
FlowLayoutPanel1.Controls.Clear()
Try
Dim listaFiltrada As List(Of Dados1) = liste.FindAll(Function(x As Dados1) x.nome.Contains(TextBox1.Text))
For Each cont As Dados1 In listaFiltrada
Dim l As New Label
l.AutoSize = True
l.Text = cont.Id & [Ô] : Nome: [Ô] & cont.nome & [Ô] - Idade: [Ô] & cont.idade
FlowLayoutPanel1.Controls.Add(l)

Next

Catch ex As Exception
MessageBox.Show([Ô]Erro : [Ô] + ex.Message)
End Try
End Sub
End Class



troquei umas mensagens com o KERP sobre o OOP para me dar uma orientada no começo, más acho que abrir um novo tópico como o KERP disse, pode ajudar outras pessoas também.

Segue a duvida,

- Kerp mencionou o uso do Dispose/Using na classe, porém a duvida é, se eu usar um dispose na minha classe List(of..) eu não perderia os dados que tenho para eventualmente usa-los? tecnicamente teria que dar um Select no banco toda vez que for usar? isso ajudaria no desempenho/velocidade do programa?
VARUS 15/09/2016 14:38:29
#466968
Outra duvida, estou tentando implementar o load dos dados na classe também, porém não to tendo bons resultados kk

  Public Function Todos() As List(Of Dados1)
Using conn As New MySqlConnection([Ô]server=localhost;user id=root;password=123456;database=test[Ô])
Using cmd As New MySqlCommand([Ô]SELECT * FROM Clientes[Ô], conn)
conn.Open()
Using rdr As MySqlDataReader = cmd.ExecuteReader()
While rdr.Read()
Todos.Add(New Dados1(rdr(0), rdr.Item([Ô]nome[Ô]), rdr.Item([Ô]idade[Ô])))
Return (Todos)
End While
End Using
End Using
End Using

End Function


  Public Class Form1
Dim Dados As New BindingSource
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dados.DataSource = Dados1.Todos()

End Sub





a variável todos na classe está sublinhado em verde com a mensagem;

Citação:

Variável [ô]Todos[ô] é usada antes de ter sido atribuído um valor. Uma exceção de referência nula pode resultar em tempo de execução.



ASHKATCHUP 15/09/2016 15:07:18
#466969
Sobre o erro:

  Public Function Todos() As List(Of Dados1)
dim result as New List(Of Dados1)
Using conn As New MySqlConnection([Ô]server=localhost;user id=root;password=123456;database=test[Ô])
Using cmd As New MySqlCommand([Ô]SELECT * FROM Clientes[Ô], conn)
conn.Open()
Using rdr As MySqlDataReader = cmd.ExecuteReader()
While rdr.Read()
result.Add(New Dados1(rdr(0), rdr.Item([Ô]nome[Ô]), rdr.Item([Ô]idade[Ô])))
Return (result)
End While
End Using
End Using
End Using

End Function

ASHKATCHUP 15/09/2016 15:12:26
#466970
E, sobre o Disposal, salvo melhor juízo, o KERP estava falando sobre os seguintes objetos:

       Using conn As New MySqlConnection([Ô]server=localhost;user id=root;password=123456;database=test[Ô])
Using cmd As New MySqlCommand([Ô]SELECT * FROM Clientes[Ô], conn)


Conforme documentação do MSDN, o Disposable deve ser chamado sempre que houver a utilização de um recurso externo, geralmente identificado pelo prefixo using
VARUS 15/09/2016 15:30:17
#466971
Public Class Dados1
Public Id As Integer
Public Property nome As String
Public Property idade() As Integer

Public Sub New(_id As Integer, _nome As String, _idade As Integer)
Me.Id = _id
Me.nome = _nome
Me.idade = _idade
End Sub


Public Shared Function Todos() As List(Of Dados1)
Dim result As New List(Of Dados1)
Using conn As New MySqlConnection([Ô]server=localhost;user id=root;password=123456;database=test[Ô])
Using cmd As New MySqlCommand([Ô]SELECT * FROM Clientes[Ô], conn)
conn.Open()
Using rdr As MySqlDataReader = cmd.ExecuteReader()
While rdr.Read()
result.Add(New Dados1(rdr(0), rdr.Item([Ô]nome[Ô]), rdr.Item([Ô]idade[Ô])))

End While
Return (result)
End Using
End Using
End Using

End Function



End Class



     Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
FlowLayoutPanel1.Controls.Clear()
Try
Dim listaFiltrada As List(Of Dados1) = Dados1.Todos.FindAll(Function(x As Dados1) x.nome.Contains(TextBox1.Text))
For Each cont As Dados1 In listaFiltrada
Dim l As New Label
l.AutoSize = True
l.Text = cont.Id & [Ô] : Nome: [Ô] & cont.nome & [Ô] - Idade: [Ô] & cont.idade
FlowLayoutPanel1.Controls.Add(l)
Next

Catch ex As Exception
MessageBox.Show([Ô]Erro : [Ô] + ex.Message)
End Try
End Sub



Criar uma variavel global do tipo list para toda vez que precisar fazer uma busca
  Public Class Form1
DIm Clientes As List(Of Dados1)

seria uma má pratica?
Porque o que estou entendendo é que toda vez que precisar fazer uma pesquisa, terei que iniciar uma conexão, é isso?
KERPLUNK 15/09/2016 19:52:19
#466984
No seu método [Ô]Todos[Ô], o retorno (Return (result)) deve ser a última coisa a acontecer, depois(fora) dos blocos using, para que eles sejam corretamente descartados. De resto, me parece bom.
VARUS 15/09/2016 22:40:29
#466994
mas e se eu tiver muitos dados no banco, isso não iria ficar travando?
KERPLUNK 15/09/2016 22:46:28
#466995
Não necessariamente. O DataReader é muito rápido para ler dados, bem mais que qualquer outro, afinal de contas, ele é projetado exatamente para isso. Ler dados, sempre vai ter um tempinho, JAMAIS vai ser algo instantâneo. Se estiver muito pesado, então desenvolva métodos que tragam somente o necessário para cada operação, passe parâmetros para ele, reduza o range de registros, isso também é uma boa prática. Ler dados, não significa ler toda a tabela toda vez.
Faça seu login para responder