BOAS PRATICAS
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;
E o form;
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?
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?
Outra duvida, estou tentando implementar o load dos dados na classe também, porém não to tendo bons resultados kk
a variável todos na classe está sublinhado em verde com a mensagem;
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.
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
E, sobre o Disposal, salvo melhor juÃzo, o KERP estava falando sobre os seguintes objetos:
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
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
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?
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.
mas e se eu tiver muitos dados no banco, isso não iria ficar travando?
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